我的朋友制作了一个x86工作的小概念验证汇编程序。我决定将它移植到x86_64上,但是我立即遇到了问题。Python的ctypes和函数调用
我在C写一小块程序,然后编译和objdumped的代码。之后,我把它插入到我的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部分被写保护?
更好的答案。 valloc是有用的,就像注意到EXEC位在这之后没有被清除。但我可能对这两方面都不感兴趣。 – Cheery 2008-11-09 08:45:43