我的朋友制作了一个在x86上运行的小型概念证明汇编器。我决定将其移植到x86_64上,但我立即遇到了一个问题。
我用C语言写了一个小程序,然后编译并objdump了代码。之后我将其插入到我的Python脚本中,因此x86_64代码是正确的:
from ctypes import cast, CFUNCTYPE, c_char_p, c_long
buffer = ''.join(map(chr, [ #0000000000000000 <add>:
0x55, # push %rbp
0x48, 0x89, 0xe5, # mov %rsp,%rbp
0x48, 0x89, 0x7d, 0xf8, # mov %rdi,-0x8(%rbp)
0x48, 0x8b, 0x45, 0xf8, # mov -0x8(%rbp),%rax
0x48, 0x83, 0xc0, 0x0a, # add $0xa,%rax
0xc9, # leaveq
0xc3, # retq
]))
fptr = cast(c_char_p(buffer), CFUNCTYPE(c_long, c_long))
print fptr(1234)
现在,每次运行此脚本时为什么会出现分段错误?
我还有一个关于mprotect和不执行标志的问题。据说这可以保护免受大多数基本安全漏洞的影响,例如缓冲区溢出。但它使用的真正原因是什么?您可以继续编写直到达到.text,然后将指令注入到一个很好的PROT_EXEC区域中。除非,当然,您在.text中使用写保护。
但是,为什么到处都要使用PROT_EXEC呢?难道您的.text部分受到写保护就不能帮助您吗?