- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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的开始
您可能关注的文档
- C Prime 中文版(第四版)学习笔记.doc
- c 中 expicit关键字的含义和用法.doc
- C++(C)多线编程之一.docx
- C++程序设计大实验(精品课程)大纲.docx
- C++程序设计教(第二版)钱能学习笔记.doc
- C++程序设计教大纲(初级中级).doc
- C++程序设计模试题及答案.docx
- C++程序设计练(答案).doc
- C++程序语言模试题及答案.doc
- c++语言程序设自测练习(二).doc
- 碳中和战略2025:建筑行业绿色建筑设计与施工技术解析.docx
- 合成氨装置操作工《合成氨装置操作高级工微信做题》模拟考试卷_0.doc
- 面向2025年工业互联网的异构数据库融合技术挑战与创新研究报告.docx
- 2024年通信工程师考试题库试题及参考答案详解【能力提升】.docx
- 2025年连锁零售业态试点项目投资评估与风险规避报告.docx
- 碳中和战略2025:交通运输行业港口物流绿色化发展报告.docx
- 碳中和战略2025:交通运输行业绿色物流运输车辆节能减排创新报告.docx
- 2025年耕地保护与质量提升技术在南方地区的应用研究.docx
- 针对2025年跨境电商进口的风险评估与信用评级报告.docx
- 合成氨装置操作工《合成氨装置操作高级工微信做题》模拟考试卷_1.doc
文档评论(0)