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

如何在使用pwntools时让Python脚本在目标程序崩溃/退出后继续执行?

解决pwntools中p.interactive()后进程退出导致后续代码无法执行的问题

嘿,这个问题我之前搞pwn的时候也遇到过!你碰到的问题本质是p.interactive()会一直阻塞到它没办法再和目标进程交互,但默认情况下,当进程崩溃或退出时,它不会自动返回,导致后续代码被卡住。这里有几个靠谱的解决办法:

方法一:捕获EOFError异常

当目标进程崩溃或退出时,p.interactive()会因为无法获取进程的输出/输入而抛出EOFError,我们可以通过捕获这个异常来跳出阻塞,继续执行后续代码:

from pwn import *
p = process("./proc")

try:
    # 启动交互模式
    p.interactive()
except EOFError:
    # 进程已退出,无需额外操作,直接继续
    pass

# 不管进程是崩溃还是正常退出,这里的代码都会执行
print("Some stuff")

这个方法简单直接,既覆盖了进程崩溃的情况,也能处理你主动退出交互(比如按Ctrl+D)的场景。

方法二:用线程异步运行交互模式

如果你的脚本需要在交互的同时做其他事情,或者想更灵活地控制流程,可以把p.interactive()放到线程里运行,主线程等待进程结束后再执行后续操作:

from pwn import *
import threading

p = process("./proc")

def run_interactive():
    try:
        p.interactive()
    except:
        # 捕获所有可能的异常,避免线程挂起
        pass

# 启动守护线程,主线程退出时线程也会跟着结束
threading.Thread(target=run_interactive, daemon=True).start()

# 等待目标进程完全退出
p.wait()

# 进程退出后执行后续操作
print("Some stuff")

这个方法的好处是主线程不会被p.interactive()阻塞,你还可以在p.wait()之前添加其他需要并行执行的逻辑。

额外提示

如果你需要在进程退出前做一些周期性操作,也可以结合p.poll()来检查进程状态:

import time
from pwn import *
p = process("./proc")

# 启动交互线程
threading.Thread(target=lambda: p.interactive(), daemon=True).start()

# 周期性检查进程状态
while p.poll() is None:
    print("进程还在运行...")
    time.sleep(2)

# 进程退出后执行后续代码
print("Some stuff")

不过前两种方法对于你的场景来说已经足够好用啦!

内容的提问来源于stack exchange,提问作者BitFriends

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:47:47