gpt4 book ai didi

linux - 如何在 python 中调用 linux 系统调用 PROCESS_VM_READV?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:15 25 4
gpt4 key购买 nike

我正在尝试学习如何在 python 中调用 PROCESS_VM_READV。从 the manual 读取,我决定创建与他们的示例类似的东西。

我已经在具有根访问权限的终端中打开了 python3。然后导入并初始化所需的模块和变量

import ctypes
libc = ctypes.CDLL('libc.so.6')
vm=libc.process_vm_readv

在示例中,有一个名为 iovec 的结构体.所以,我需要在 python 中重新创建它

class iovec(ctypes.Structure):
_fields_=[("iov_base",ctypes.c_void_p),("iov_len",ctypes.c_int)]

然后创建本地变量和远程变量

p1=ctypes.c_char_p(b"")
p1=ctypes.cast(p1,ctypes.c_void_p)
local=iovec(p1,10)
remote=iovec(0x00400000,20) # Address of ELF header

最后,使用 KMines 的 pid 调用 PROCESS_VM_READV

vm(2242,local,2,remote,1,0)

但是它返回-1,并且本地或远程的 iov_base 没有变化。我觉得我在这里犯了一个非常简单的错误,但我不能完全指责它。

感谢任何帮助,祝你有美好的一天。

最佳答案

这里可能为时已晚,但我能够从 process_vm_readv here 的人那里复制示例

我们需要传递一个有效的可读远程地址,出于测试目的,我编译了一个简单的 hello world 并使用 gdb 读取了一个有效地址

(gdb) break main
Breakpoint 1 at 0x5a9: file hello.c, line 4.
(gdb) run
Starting program: /user/Desktop/hello
=> 0x800005a9 <main+25>: sub esp,0xc
0x800005ac <main+28>: lea edx,[eax-0x19b0]
0x800005b2 <main+34>: push edx
0x800005b3 <main+35>: mov ebx,eax
0x800005b5 <main+37>: call 0x800003f0 <puts@plt>
0x800005ba <main+42>: add esp,0x10
0x800005bd <main+45>: nop
0x800005be <main+46>: lea esp,[ebp-0x8]
0x800005c1 <main+49>: pop ecx
0x800005c2 <main+50>: pop ebx
(gdb) x/20b 0x800005a9
0x800005a9 <main+25>: 0x83 0xec 0x0c 0x8d 0x90 0x50 0xe6 0xff
0x800005b1 <main+33>: 0xff 0x52 0x89 0xc3 0xe8 0x36 0xfe 0xff
0x800005b9 <main+41>: 0xff 0x83 0xc4 0x10

下面是检索相同结果的python代码

from ctypes import *

class iovec(Structure):
_fields_ = [("iov_base",c_void_p),("iov_len",c_size_t)]

local = (iovec*2)() #create local iovec array
remote = (iovec*1)()[0] #create remote iovec
buf1 = (c_char*10)()
buf2 = (c_char*10)()
pid = 25117

local[0].iov_base = cast(byref(buf1),c_void_p)
local[0].iov_len = 10
local[1].iov_base = cast(byref(buf2),c_void_p)
local[1].iov_len = 10
remote.iov_base = c_void_p(0x800005a9) #pass valid readable address
remote.iov_len = 20


libc = CDLL("libc.so.6")
vm = libc.process_vm_readv

vm.argtypes = [c_int, POINTER(iovec), c_ulong, POINTER(iovec), c_ulong, c_ulong]

nread = vm(pid,local,2,remote,1,0)

if nread != -1:
bytes = "[+] "
print "[+] received %s bytes" % (nread)
for i in buf1: bytes += hex(ord(i)) + " "
for i in buf2: bytes += hex(ord(i)) + " "
print bytes

输出

user@ubuntu:~/Desktop# python process_vm_readv.py
[+] received 20 bytes
[+] 0x83 0xec 0xc 0x8d 0x90 0x50 0xe6 0xff 0xff 0x52 0x89 0xc3 0xe8 0x36 0xfe 0xff 0xff 0x83 0xc4 0x10

关于linux - 如何在 python 中调用 linux 系统调用 PROCESS_VM_READV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42237761/

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