栈迁移(EBP2Ret)

Overview

局部变量在栈溢出后,先经过Saved EBP,再到达Saved EIP。如果能溢出的字节数有限,以至于只能篡改到Saved EBP的数据,就无法通过修改Saved EIP里的数据控制程序走向。通过篡改Saved EBP的数据,在ret后,ESP会指向Saved EBP中的地址,从而实现栈的迁移。

实施条件

令Saved EIP所指向的执行语句为:
leave; ret

leave等效于:


mov ESP, EBP
pop EBP

ret等效于:


pop EIP

实施方法

将Saved EBP中的数据修改为Attack Payload的地址。这样执行”mov ESP, EBP”时就会使ESP指向被篡改的地址区域。
构建位于Attack Payload地址处的exploit:
Payload最开始必须为4 dummy bytes(因为后面接上“pop EBP”,需要补4各字节)。在第二次ret(第一次执行了leave;ret,第二次执行恶意代码)后,
开始紧接其后的payload:

  • A valid ONE_GADGET address.
  • The address of system() followed **by 4 junk bytes** and the address of "/bin/sh" (x86 bits).
  • The address of a jump esp; gadget (ret2esp) followed by the shellcode to execute.
  • Some ROP chain