如何使用Python Pwntools向指定文件描述符(fd)写入数据
如何使用Python Pwntools向指定文件描述符(fd)写入数据
我明白你遇到的问题了——想用pwntools的process向特定fd写数据,但试了stdin/stdout参数摸不着门道,用命名管道还碰到了阻塞的坑。别慌,咱们一步步来解决:
首先得明确:pwntools的process底层基于Python的subprocess,默认只帮你封装了标准输入(fd=0)、输出(fd=1)、错误(fd=2)的交互。如果要和非标准fd(比如fd=3、fd=4这类)打交道,就得手动做文件描述符的重定向,而且要避开管道阻塞的问题。
解决思路:用匿名管道+子进程预执行钩子
命名管道阻塞的根源是「写端打开时没有读端存在」,那咱们换用匿名管道,同时让子进程在启动时就接管管道的读端,这样父进程写的时候就不会卡住了。具体步骤如下:
- 创建匿名管道:用
os.pipe()生成一对读写fd,父进程拿写端,子进程把目标fd重定向到读端。 - 预执行钩子:通过
preexec_fn参数,让子进程在启动前完成fd的重定向操作。 - 写入数据:把写端包装成文件对象,直接向目标fd写内容。
代码示例
假设你要给子进程的fd=3写入数据,代码可以这么写:
import os from pwn import * # 创建匿名管道,得到读端(r)和写端(w)的fd read_fd, write_fd = os.pipe() def setup_child_fd(): # 把子进程的fd=3重定向到管道的读端 os.dup2(read_fd, 3) # 子进程不需要管道的读写端,关闭它们 os.close(read_fd) os.close(write_fd) # 启动目标程序,传入预执行钩子 target_process = process('./your_target_binary', preexec_fn=setup_child_fd) # 父进程关闭不需要的读端 os.close(read_fd) # 把写端包装成可写入的文件对象 target_writer = os.fdopen(write_fd, 'w') # 向子进程的fd=3写入数据 target_writer.write("Data for fd 3!\n") target_writer.flush() # 一定要刷新缓冲区,不然数据可能没发出去 # 之后可以正常和进程的标准输入交互 target_process.sendline("Hello to stdin!") target_process.interactive()
补充说明
- 如果只是和标准fd(stdin/stdout)交互,直接用pwntools封装好的
send()/sendline()/recv()方法就行,不用这么麻烦。 - 匿名管道是进程间通信的轻量方式,比命名管道更适合这种场景,因为它不需要创建文件系统中的实体,而且能避免阻塞问题。
备注:内容来源于stack exchange,提问作者LavaTime
相关产品推荐
相关产品推荐

