ROP 说明
复制本地路径 | 在线编辑
ret2libc 是把返回地址修改成 system('/bin/sh') 这种的代码段,但大部分时候没办法直接用。所以 ROP 就是解决这个的。
他是把返回地址改成下面的这些 gadget:
<若干条指令>
ret
栈里面改成:
rsp → gadget1
gadget2
gadget3
...
最后就能够达到 gadget1 → ret → gadget2 → ret → gadget3 ... 这样的方式。
举例
下面是用 ROP 执行 system('/bin/sh') 的例子。
rsp →
0x40123a ; gadget: pop rdi; ret
0x404050 ; "/bin/sh" 的地址
0x7ffff7e12340 ; system()
- 跳到
pop rdi的时候,rsp指向的是0x404050,所以rdi就是这个地址,rdi通常用于表示第一个参数的地址。 - 然后
ret的时候,rsp指向的是system的地址,所以指向了system(rdi)