【问题标题】:PwnTools recv() on output that expects input directly afterPwnTools recv() 在输出上直接期望输入
【发布时间】:2019-10-12 15:09:33
【问题描述】:

您好,我有一个问题,我似乎找不到任何解决方案。 (也许我只是不擅长用英语正确地进行搜索)

我正在尝试使用 pwntools 从 python 执行一个二进制文件,并在自己发送一些输入之前完全读取它的输出。

我的二进制输出如下:

Testmessage1
Testmessage2
Enter input: <binary expects me to input stuff here>

我想阅读第一行、第二行和第三行的输出部分(':' 是最后一个字符)。

输出的第三行末尾不包含换行符,并希望用户直接进行输入。但是,无论我尝试什么,我都无法读取第三行开头的输出内容。

我目前尝试实现这一目标的方式:

from pwn import *

io = process("./testbin")
print io.recvline()
print io.recvline()
print io.recvuntil(":", timeout=1) # this get's stuck if I dont use a timeout
...
# maybe sending data here
# io.send(....)
io.close()

我对标准输入和标准输出有误解吗?第三行的“输入输入:”不是我在输入之前应该能够接收的输出的一部分吗?

提前致谢

【问题讨论】:

  • .recv() 有什么作用吗?另外,你看过.sendlineafter()吗?
  • 刚刚试了这两个。可悲的是它也被卡住了:(

标签: python stdout stdin pwntools


【解决方案1】:

我终于明白了。 我得到了我需要的提示 https://github.com/zachriggle/pwntools-glibc-buffering/blob/master/demo.py

似乎 Ubuntu 自己做了很多缓冲。 当手动确保 pwnTools 对 stdin 和 stdout 使用伪终端时,它可以工作!

import * from pwn

pty = process.PTY
p = process(stdin=pty, stdout=pty)

【讨论】:

    【解决方案2】:

    您可以使用更可靠且可用于远程连接的清洁功能:https://docs.pwntools.com/en/dev/tubes.html#pwnlib.tubes.tube.tube.clean

    例如:

    def start():
        p = remote("0.0.0.0", 4000)
        return p
    
    io = start()
    io.send(b"YYYY")
    io.clean()
    io.send(b"ZZZ")
    

    【讨论】: