输出上的 PwnTools recv() 期望在之后直接输入
PwnTools recv() on output that expects input directly after
您好,我有一个问题,我似乎找不到任何解决方案。
(也许我在用英语正确措辞搜索方面很糟糕)
我正在尝试使用 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()
我是不是对 stdin 和 stdout 有什么误解?第三行的 "Enter input:" 不是我在进行输入之前应该能够接收到的输出的一部分吗?
提前致谢
我终于明白了。
我得到了我需要的提示
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)
你可以使用更可靠的clean函数,它可以用于远程连接: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")
您好,我有一个问题,我似乎找不到任何解决方案。 (也许我在用英语正确措辞搜索方面很糟糕)
我正在尝试使用 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()
我是不是对 stdin 和 stdout 有什么误解?第三行的 "Enter input:" 不是我在进行输入之前应该能够接收到的输出的一部分吗?
提前致谢
我终于明白了。 我得到了我需要的提示 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)
你可以使用更可靠的clean函数,它可以用于远程连接: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")