我正在尝试在32位Ubuntu 11.10机器上执行ROP链,并且RET指令似乎以意想不到的方式运行。
我正在使用python构建有效负载:
$scope.generateJsonSchema = function() {
var json_object = JSON.parse($scope.json_input)
console.log(json_object)
}
使用的地址来自可执行文件的.text部分。没有使用共享库中的地址。
我的代码跳转到0x8049b4f,将第2行的值弹出到EAX中,向ESP添加0x5c并调用RET。
一切都按预期工作,EIP跳转到0x8048bf0。
执行POP EBX,将值从第5行移到EBX
下一条指令是RET,它应该将堆栈中的最高值(即0x80493fe)弹出到EIP中。执行RET时,我得到:
无法访问地址0x41414145
的内存此时EIP指向0x80493fe(正如预期的那样),并且来自ESP的最高值被激活。
当程序流程开始执行我的ROP链时(因此,在EIP位于第1行的0x8049b4f之前),ESI,EDI和EBP都包含0x41414141
不知何故,来自第4行的RET尝试使用ESI / EDI / EBP + 4(最有可能是EBP),但是什么?
为什么会这样?我错过了什么?
我在这里添加了调试过程的屏幕截图:
https://www.dropbox.com/sh/9sickyhmryop27y/AADIHbIPE177PCu3fmqsVFKpa?dl=0