C:咋在这种情况下改变输出顺序
这种东西完全就是一些黑科技,而且stack frame的安排会随着编译参数的不同而改变,若是想要swap call stack里的两个返回地址的话代码根本没有移植性好吧.另外.text段是不可写的,Windows下可以通过VirtualProtectEx改,但是题目中明确表明不能用其他函数什么的...汗...还是老老实实swap call stack里的两个返回地址吧, @汪芃 不用汇编的方法也是有的,不过这个高度依赖编译参数拿VS2013来说吧,编译选项:Release|Win32 优化:已禁用 (/Od)#include \u0026lt;stdio.h\u0026gt; void a(); void b(); void c(); //函数原型int main() { a(); printf("\"); return 0; } //mainvoid a() { b(); printf("one "); }void b() { c(); printf("two "); }void c() {\tint x;\t// 在此处加代码\tint *rpa, *rpb;\trpa = \u0026amp;x+3; //指向c()的返回地址 \trpb = rpa + 2; //指向b()的返回地址\tx = *rpa;\t*rpa = *rpb,*rpb = x; //Swap!!!} //return WTF?好的,让我们来看看发生了什么观察反汇编这是函数b的反汇编:void b(){ push ebp mov ebp,esp \tc(); call c (0AA1040h) \tprintf("two "); push 0AA2108h \tprintf("two "); call dword ptr ds: add esp,4 } pop ebp ret 在b()调用c()之前先保存了ebp的值,然后再call c (0AA1040h) ,也就是说栈里面返回到a()和b()中间插了个ebp.现在来看函数c的反汇编:void c(){ push ebp mov ebp,esp sub esp,10h mov eax,dword ptr ds: xor eax,ebp mov dword ptr ,eax \tint x;\tint *rpa,*rpb;\trpa = \u0026amp;x+3; lea eax, mov dword ptr ,eax \trpb = rpa + 2; mov ecx,dword ptr add ecx,8 mov dword ptr ,ecx \tx = *rpa; mov edx,dword ptr mov eax,dword ptr mov dword ptr ,eax \t*rpa = *rpb; mov ecx,dword ptr mov edx,dword ptr mov eax,dword ptr mov dword ptr ,eax \t*rpb = x; mov ecx,dword ptr mov edx,dword ptr mov dword ptr ,edx } mov ecx,dword ptr xor ecx,ebp call __security_check_cookie (0DC10AAh) mov esp,ebp pop ebp ret 观察上面的\trpa = \u0026amp;x+3;lea eax, mov dword ptr ,eax 栈帧示意图:
我们会发现x的地址实际上就是ebp-0x08,其中ebp-0x04是开启了编译选项安全检查:(/GS)之后用于检查ebp是否发生改变防止溢出的,和最后的__security_check_cookie有关.这里可以不管它.rpa = \u0026amp;x+3;就是指向ebp+4为返回b()的地址,根据前面的分析返回b()的地址和返回a()的地址中间相隔了4byte,那么rpb = rpa + 2;就是指向返回a()的地址.最后交换一下返回地址那么c()执行完了之后就会跳转到a()执行printf("one ");然后跳转到b()执行printf("two ");最后跳回到main退出.特别指出一点:因为a()和b()的栈帧简单结构相同所以才可以直接swap返回地址,要不还要整个栈帧交换...多写个循环...如果改了编译参数或平台的话地址要自己重新掰手指算咯,所以嘛根本没有移植性好嘛.同时也是强烈不推荐这么写.这个绝对是黑科技,嗯,专门黑人的科技...你们老师为什么要教这些啊!?
推荐阅读
- 汽车|一个人,改变一个国家的汽车设计?
- 猫扑网南迁广西,媒体唱衰BBS,论坛的未来会怎么样怎样改变
- 直肠癌|一个不起眼的排便习惯改变,却是晚期直肠癌的“信号”!别再忽视
- 趣头条|2021款大众朗逸实车到店,内饰很大方,轴距2688mm,动力输出稳定
- 黑五|
- 新浪汽车出品|新能源是如何改变汽车设计潮流的
- 有啥提升macbook pro按键手感的工具
- eSIM及5G时代对三大运营商改变是啥
- 新浪汽车出品|新能源汽车的里程碑 特斯拉的设计改变你的认知
- 山东双非一本软件工程(SE)学生,想通过考研改变院校出身并提升自身能力。以下学校怎样选择
