如何在使用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
相关产品推荐
相关产品推荐

