ROP栈迁移
通过leave和ret指令,将栈帧劫持到指定地址。一般用于存在溢出,但可溢出的字节数不足以写入完成ROP chain的情况。通过栈帧劫持,在可供写入的缓冲区内完成ROP chain构造,然后将栈帧劫持到指定地址,完成控制流劫持。
leave =
mov esp,ebp
pop ebp
ret=
pop eip
通过栈帧劫持,存在栈溢出的位置最少只需溢出两个dword(qword in x64)就可以完全控制程序执行流
如上程序,char s处存在两个dword的溢出,可以覆盖last_ebp和ret_addr,不足以布置完整ROP chain。但char s共可以写入0x30个字节,可以将栈帧劫持到char s,并布置ROP chain。
程序中存在两个read+printf操作,可以泄露当前ebp地址,从而计算所需偏移。