我的朋友制作了一个适用于 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 部分被写保护不是很有帮助吗?