Skip to content

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()

  1. 跳到 pop rdi 的时候,rsp 指向的是 0x404050,所以 rdi 就是这个地址,rdi 通常用于表示第一个参数的地址。
  2. 然后 ret 的时候,rsp 指向的是 system 的地址,所以指向了 system(rdi)

Comments