Python Ctype分割错误

问题描述:

这是使用ctype运行shellcode的代码。 shellcode在64位linux上运行“whoami”。但是这个程序给了我一个“分段错误”。但我无法找出它的错误。代码的结构是从: ctypes: Cast string to function?Python Ctype分割错误

#!/usr/bin/python 

from ctypes import * 

# /usr/bin/whoami 
shellcode_data = ("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00\x53" 
"\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6\x52\xe8\x10\x00" 
"\x00\x00\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61" 
"\x6d\x69\x00\x56\x57\x48\x89\xe6\x0f\x05"); 

shellcode = c_char_p(shellcode_data) 
function = cast(shellcode, CFUNCTYPE(None)) 
function() 

对于32位体系结构,这将是壳代码:

shellcode_data = ("\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68" 
"\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x10\x00\x00\x00\x2f" 
"\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61\x6d\x69\x00" 
"\x57\x53\x89\xe1\xcd\x80"); 

NX Bit的防止在现代处理器和操作系统正在执行的随机数据。为了解决它,请致电mprotect。您还应该将shellcode定义为二进制而不是字符串,如下所示:

#!/usr/bin/python 
import ctypes 
shellcode_data = (b"\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00\x53" 
    b"\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6\x52\xe8\x10\x00" 
    b"\x00\x00\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61" 
    b"\x6d\x69\x00\x56\x57\x48\x89\xe6\x0f\x05") 

shellcode = ctypes.create_string_buffer(shellcode_data) 
function = ctypes.cast(shellcode, ctypes.CFUNCTYPE(None)) 

addr = ctypes.cast(function, ctypes.c_void_p).value 
libc = ctypes.CDLL('libc.so.6') 
pagesize = libc.getpagesize() 
addr_page = (addr // pagesize) * pagesize 
for page_start in range(addr_page, addr + len(shellcode_data), pagesize): 
    assert libc.mprotect(page_start, pagesize, 0x7) == 0 

function() 
+0

谢谢。这解决了这个问题。 –

+0

@ J.F.Sebastian事实上,现代Python版本将'shellcode_data'的值放入一个无法保护的页面中。但是,我相信在这些情况下,断言应该会失败。 'create_string_buffer'目前似乎对cpython有效。 – phihag