C 中通过溢出盖虚函数指针列表执行代码.docVIP

C 中通过溢出盖虚函数指针列表执行代码.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 中通过溢出盖虚函数指针列表执行代码

C++中通过溢出覆盖虚函数指针列表执行代码 目录: 1. C++中虚函数的静态联编和动态联编 2. VC中对象的空间组织和溢出试验 3. GCC中对象的空间组织和溢出试验 4. 参考 一 C++中虚函数的静态联编和动态联编 C++中的一大法宝就是虚函数,简单来说就是加virtual关键字定义的函数。 其特性就是支持动态联编。现在C++开发的大型软件中几乎已经离不开虚函数的 使用,一个典型的例子就是虚函数是MFC的基石之一。 这里有两个概念需要先解释: 静态联编:通俗点来讲就是程序编译时确定调用目标的地址。 动态联编:程序运行阶段确定调用目标的地址。 在C++中通常的函数调用都是静态联编,但如果定义函数时加了virtual关键 字,并且在调用函数时是通过指针或引用调用,那么此时就是采用动态联编。 一个简单例子: // test.cpp #includeiostream.h class ClassA { public: int num1; ClassA(){ num1=0xffff; }; virtual void test1(void){}; virtual void test2(void){}; }; ClassA objA,* pobjA; int main(void) { pobjA=objA; objA.test1(); objA.test2(); pobjA-test1(); pobjA-test2(); return 0; } 使用VC编译: 开一个命令行直接在命令行调用cl来编译: (如果你安装vc时没有选择注册环境 变量,那么先在命令行运行VC目录下bin\VCVARS32.BAT ) cl test.cpp /Fa 产生test.asm中间汇编代码 接下来就看看asm里有什么玄虚,分析起来有点长,要有耐心 ! 我们来看看: 数据定义: _BSS SEGMENT ?objA@@3VClassA@@A DQ 01H DUP (?) ;objA 64位 ?pobjA@@3PAVClassA@@A DD 01H DUP (?) ;pobjA 一个地址32位 _BSS ENDS 看到objA为64位,里边存放了哪些内容呢? 接着看看构造函数: _this$ = -4 ??0ClassA@@QAE@XZ PROC NEAR ; ClassA::ClassA() 定义了一个变量 _this ?! ; File test.cpp ; Line 6 push ebp mov ebp, esp push ecx mov DWORD PTR _this$[ebp], ecx ; ecx 赋值给 _this ?? 不明白?? mov eax, DWORD PTR _this$[ebp] mov DWORD PTR [eax], OFFSET FLAT:??_7ClassA@@6B@ ; ClassA::`vftable ; 前面的部分都是编译器加的东东,我们的赋值在这里 mov ecx, DWORD PTR _this$[ebp] mov DWORD PTR [ecx+4], 65535 ;0xffff num1=0xffff; ; 看来 _this+4就是num1的地址 mov eax, DWORD PTR _this$[ebp] mov esp, ebp pop ebp ret 0 ??0ClassA@@QAE@XZ ENDP 那个_this和mov DWORD PTR _this$[ebp], ecx 让人比较郁闷了吧,不急看看何 处调用的构造函数: _$E9 PROC NEAR ; File test.cpp ; Line 10 push ebp mov ebp, esp mov ecx, OFFSET FLAT:?objA@@3VClassA@@A call ??0ClassA@@QAE@XZ ;call ClassA::ClassA() pop ebp ret 0 _$E9 ENDP 看,ecx指向objA的地址,通过赋值,那个_this就是objA的开始

文档评论(0)

vtangojia + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档