gpt4 book ai didi

Python ctypes 和函数调用

转载 作者:太空狗 更新时间:2023-10-29 21:18:01 25 4
gpt4 key购买 nike

我的 friend 制作了一个可在 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,然后将你的指令注入(inject)一个漂亮的 PROT_EXEC 区域。当然,除非您在 .text 中使用写保护

但是,为什么到处都是 PROT_EXEC?如果您的 .text 部分被写保护,这不会有很大帮助吗?

最佳答案

作为vincent提到,这是由于分配的页面被标记为不可执行。较新的处理器支持此 functionality ,并且它被支持它的操作系统用作附加的安全层。这个想法是为了防止某些缓冲区溢出攻击。例如。一种常见的攻击是溢出堆栈变量,重写返回地址以指向您插入的代码。对于不可执行的堆栈,这现在只会产生段错误,而不是对进程的控制。堆内存也存在类似的攻击。<​​/p>

要绕过它,您需要更改保护。这只能在页面对齐的内存上执行,因此您可能需要将代码更改为如下所示:

libc = CDLL('libc.so')

# Some constants
PROT_READ = 1
PROT_WRITE = 2
PROT_EXEC = 4

def executable_code(buffer):
"""Return a pointer to a page-aligned executable buffer filled in with the data of the string provided.
The pointer should be freed with libc.free() when finished"""

buf = c_char_p(buffer)
size = len(buffer)
# Need to align to a page boundary, so use valloc
addr = libc.valloc(size)
addr = c_void_p(addr)

if 0 == addr:
raise Exception("Failed to allocate memory")

memmove(addr, buf, size)
if 0 != libc.mprotect(addr, len(buffer), PROT_READ | PROT_WRITE | PROT_EXEC):
raise Exception("Failed to set protection on buffer")
return addr

code_ptr = executable_code(buffer)
fptr = cast(code_ptr, CFUNCTYPE(c_long, c_long))
print fptr(1234)
libc.free(code_ptr)

注意:在释放页面之前取消设置可执行标志可能是个好主意。大多数 C 库在完成后实际上不会将内存返回给操作系统,而是将其保存在自己的池中。这可能意味着他们将在不清除 EXEC 位的情况下在其他地方重用该页面,从而绕过安全优势。

另请注意,这是相当不可移植的。我在 linux 上测试过它,但没有在任何其他操作系统上测试过。它不能在 Windows 上运行,购买可能在其他 Unix(BSD、OsX?)上运行。

关于Python ctypes 和函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com