mprotect 可以将堆栈本身设置为可执行吗?

逆向工程 linux 可执行
2021-07-09 10:13:59

我正在 Linux 中迈出内存开发的第一步。我正在学习练习 VM( $ uname -r -> 3.13.0-32-generic)的教程

本教程调用mprotect设置内存的某个区域可执行,然后用于read手动输入一些shellcode。

我突然想到,也许我可以使用缓冲区将我的 shellcode 加载到堆栈上,并用于将堆栈上的缓冲区mprotect设置为可执行文件并返回到它。但是由于我不确定的原因,这会引发错误。

简而言之,这个调用mprotect有效:

# mprotect: set memory executable
payload += p(0x080523e0) # mprotect addr
payload += p(0x08048882) # return to: pop, pop, pop, retn
payload += p(0xb7ffd000) # arg1: address of 'mapped' region
payload += p(0x2000)     # arg2: length
payload += p(0x7)        # arg3: rwx

但是这个调用失败了:

# mprotect: set memory executable
payload += p(0x080523e0) # mprotect addr
payload += p(0xbffff6c0) # return to shellcode in buffer on stack
payload += p(0xbffff6c0) # arg1: beginning of shellcode on stack
payload += p(0x2000)     # arg2: length
payload += p(0x7)        # arg3: rwx

单步执行mprotect第二个示例向我展示了它需要一个错误跳转:

=> 0x80523fa <mprotect+26>: jae    0x8053870 <__syscall_error>

由于两者之间的唯一区别是我想设置可执行文件的地址,我想知道是否只是mprotect无法将堆栈设置为可执行文件?

1个回答

是的,mprotect可用于使堆栈可执行。

参见,例如:

您可以通过检查调用errno后的值来进一步排除故障mprotect