我下面的教程为ROP底漆,0级教程设置内存的开始[vdso]写和可执行文件并复制的shellcode存在。
我不知道为什么,但似乎mprotect对我来说失败了:
(python exp.py; cat) | strace ./level0
...
mprotect(0xb7fff000, 8192, PROT_READ|PROT_WRITE|PROT_EXEC) = -1 ENOMEM (Cannot allocate memory)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xa7fff804} ---
+++ killed by SIGSEGV +++
我将目标地址更改为0x8048000(vmmap在 gdb-peda 中得到)。现在mprotect不返回-1,但我仍然收到 SIGSEGV:
(pyhton exp.py; cat) | strace ./level0
...
mprotect(0x8048000, 8192, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x88048804} ---
+++ killed by SIGSEGV +++
我已经检查了内存地址,与教程的唯一区别是 shellcode 以0xbfff764而不是结束0xbfff754,我相应地调整了 python 脚本。
我不明白为什么会出现这些错误,尤其是因为我使用的是下载的虚拟机。我怎样才能运行shellcode?
更新:我不知道它是否与问题有关,但是如果我将目标地址mprotect(稍后我也希望eip指向那里)设置为映射地址空间之外的地址(根据gdb),si_addr在上面的错误信息中会包含这个地址。但是如果地址属于程序的地址空间,si_addr就会不同(并且可能无效),就像上面一样。
并且如果我在执行它gdb的区域设置正确可执行,甚至执行shellcode。