能力值:
( 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中的操作来调整。
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
多谢大神指导
|
|
|