x86 RET行为

时间:2016-05-02 13:47:22

标签: linux assembly x86 gdb

我正在尝试在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

0 个答案:

没有答案