资源描述:
《c++中通过溢出覆盖虚函数指针列表执行代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++中通过溢出覆盖虚函数指针列表执行代码目录:1.C++中虚函数的静态联编和动态联编2.VC中对象的空间组织和溢出试验3.GCC中对象的空间组织和溢出试验4.参考<一>C++中虚函数的静态联编和动态联编C++中的一大法宝就是虚函数,简单来说就是加virtual关键字定义的函数。其特性就是支持动态联编。现在C++开发的大型软件中几乎已经离不开虚函数的使用,一个典型的例子就是虚函数是MFC的基石之一。这里有两个概念需要先解释:静态联编:通俗点来讲就是程序编译时确定调用目标的地址。动态联编:程序运行阶段确定调用目标的地址。在C++中通常的函数调用都是静态联编,但如果定义函数时加了virtual关键
2、字,并且在调用函数时是通过指针或引用调用,那么此时就是采用动态联编。一个简单例子://test.cpp#includeclassClassA{public:intnum1;ClassA(){num1=0xffff;};virtualvoidtest1(void){};virtualvoidtest2(void){};};ClassAobjA,*pobjA;intmain(void){pobjA=&objA;objA.test1();objA.test2();pobjA->test1();pobjA->test2();return0;}使用VC编译:开一个命令行直接在命令
3、行调用cl来编译:(如果你安装vc时没有选择注册环境变量,那么先在命令行运行VC目录下binVCVARS32.BAT)cltest.cpp/Fa产生test.asm中间汇编代码接下来就看看asm里有什么玄虚,分析起来有点长,要有耐心!我们来看看:数据定义:_BSSSEGMENT?objA@@3VClassA@@ADQ01HDUP(?);objA64位?pobjA@@3PAVClassA@@ADD01HDUP(?);pobjA一个地址32位_BSSENDS看到objA为64位,里边存放了哪些内容呢?接着看看构造函数:_this$=-4??0ClassA@@QAE@XZPROCNEAR;Clas
4、sA::ClassA()定义了一个变量_this?!;Filetest.cpp;Line6pushebpmovebp,esppushecxmovDWORDPTR_this$[ebp],ecx;ecx赋值给_this??不明白??moveax,DWORDPTR_this$[ebp]movDWORDPTR[eax],OFFSETFLAT:??_7ClassA@@6B@;ClassA::`vftable';前面的部分都是编译器加的东东,我们的赋值在这里movecx,DWORDPTR_this$[ebp]movDWORDPTR[ecx+4],65535;0xffffnum1=0xffff;;看来_th
5、is+4就是num1的地址moveax,DWORDPTR_this$[ebp]movesp,ebppopebpret0??0ClassA@@QAE@XZENDP那个_this和movDWORDPTR_this$[ebp],ecx让人比较郁闷了吧,不急看看何处调用的构造函数:_$E9PROCNEAR;Filetest.cpp;Line10pushebpmovebp,espmovecx,OFFSETFLAT:?objA@@3VClassA@@Acall??0ClassA@@QAE@XZ;callClassA::ClassA()popebpret0_$E9ENDP看,ecx指向objA的地址,通过赋
6、值,那个_this就是objA的开始地址,其实CLASS中的非静态方法编译器编译时都会自动添加一个this变量,并且在函数开始处把ecx赋值给他,指向调用该方法的对象的地址。那么构造函数里的这两行又是干什么呢?moveax,DWORDPTR_this$[ebp]movDWORDPTR[eax],OFFSETFLAT:??_7ClassA@@6B@;ClassA::`vftable'我们已经知道_this保存的为对象地址:&objA。那么eax=&objA接着就相当于(*eax)=OFFSETFLAT:??_7ClassA@@6B@来看看??_7ClassA@@6B@是哪个道上混的:CONSTS
7、EGMENT??_7ClassA@@6B@DDFLAT:?test1@ClassA@@UAEXXZ;ClassA::`vftable'DDFLAT:?test2@ClassA@@UAEXXZCONSTENDS看来这里存放的就是test1(),test2()函数的入口地址!那么这个赋值:movDWORDPTR[eax],OFFSETFLAT:??_7ClassA@@6B@;ClassA::`vfta