c++中通过溢出覆盖虚函数指针列表执行代码

c++中通过溢出覆盖虚函数指针列表执行代码

ID:16014983

大小:48.50 KB

页数:18页

时间:2018-08-07

c++中通过溢出覆盖虚函数指针列表执行代码_第1页
c++中通过溢出覆盖虚函数指针列表执行代码_第2页
c++中通过溢出覆盖虚函数指针列表执行代码_第3页
c++中通过溢出覆盖虚函数指针列表执行代码_第4页
c++中通过溢出覆盖虚函数指针列表执行代码_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。