我正在 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无法将堆栈设置为可执行文件?