You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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这类)打交道,就得手动做文件描述符的重定向,而且要避开管道阻塞的问题。

解决思路:用匿名管道+子进程预执行钩子

命名管道阻塞的根源是「写端打开时没有读端存在」,那咱们换用匿名管道,同时让子进程在启动时就接管管道的读端,这样父进程写的时候就不会卡住了。具体步骤如下:

  1. 创建匿名管道:用os.pipe()生成一对读写fd,父进程拿写端,子进程把目标fd重定向到读端。
  2. 预执行钩子:通过preexec_fn参数,让子进程在启动前完成fd的重定向操作。
  3. 写入数据:把写端包装成文件对象,直接向目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:43:12