栈迁移(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