首页
社区
课程
招聘
[求助]dep中DEP_Close工程不解!!
发表于: 2015-1-27 21:59 12824

[求助]dep中DEP_Close工程不解!!

2015-1-27 21:59
12824
记得在p330页,如下代码,pop pop pop retn是啥意思啊,不就打乱了前面描述的逻辑么,因为调试环境问题一直没成功,求解释,求橄榄枝

"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\xE9\x77\xBE\x77"//修正EBP
"\x81\x71\xBA\x7C"//pop eax
"\x0A\x1A\xBF\x7C"//pop pop pop retn
"\x3D\x68\xBE\x7C"//pop esi retn
"\xBF\x7D\xC9\x77"//push esp jmp eax
"\x9B\xF4\x87\x7C"//retn 0x30
"\x17\xF5\x96\x7C"//关闭DEP代码的起始位置
"\x23\x1E\x1A\x7D"//jmp esp
"\xE9\x27\xFF\xFF"//跳转到shellcode起始地址
"\xFF\x90\x90\x90"
;

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 292
活跃值: (830)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
之前一直没看过配套的程序,看到你问题才去调了一下,发现弹failwest牛的框没问题,就用od附加跟了一下程序,其实这个ROP链的执行流程是这样的:
第一次修正EBP的时候是retn 4,所以ESP指向的是pop esi,retn的位置,这样当pop eax的时候,eax寄存器的值就被修改成pop esi,retn的地址,也就是7CBE683D,而这时ESP是这个地址,也就是当pop eax retn之后,程序就执行到push esp,jmp eax(77c97dbf),这样的话就相当于将esp的值入栈,然后再跳转到eax的地址执行指令,eax就是pop esi,retn,其实这两条指令 push esp,jmp eax->pop esi,retn,就相当于push esp,pop esi,retn,其实和修正ebp是一个概念,至于原因,failwest牛解释的很清楚了,在disable dep的时候有一个对[esi+37]的or操作,所以esi的值必须是可读的。retn之后ESP就到了retn 30,这是为了给disable dep开辟一片可以进行读写操作的空间而不破坏ROP链,其实就是保证不破坏后面的回跳指令,在执行完disable dep之后最后会执行leave   retn 4,这样当函数退出,返回的时候就回到了pop,pop,pop,retn,这样三个pop的作用就很明显了,就是修正程序执行流程到jmp esp,也就是收回程序控制权,然后就是到E9 27这个回跳指令,然后就到shellcode了。
其实ROP链的布置很灵活,只要你能控制EIP的话就在dll里随意飞奔了,比如我没有pop esi,retn指令的话,在pop,pop,pop,retn的位置只需要pop两次就可以收回控制权了。当然我也只是举个例子,具体的内容还是需要调试之后才能执行。
遇到这种构造ROP链的部分我个人感觉还是先自己写一个溢出的小程序,然后自己布置ROP链跟着调一下,调好了再布置到exploit里再调,我测试环境是windows server 2003,按照failwest牛的说法是在2003的disable dep中有一个 or [esi+37],80,pop esi,leave retn4的部分,所以需要这么布局,至于其他环境的话应该还是需要调整的,具体要根据disable dep中的操作来调整。
2015-1-29 18:44
0
雪    币: 47
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
多谢大神指导
2015-1-30 12:59
0
游客
登录 | 注册 方可回帖
返回
//