问题描述
我试图让 read 在程序中返回 0(while 循环中的那个),然后正确执行第二次 read,这完全是手动的,使用 CTRL-D
。但是我想在 pwntools (p = process("./test")
) 中做同样的事情。我已经尝试用 p.sendline("\x04")
发送 eof 字符但没有用。程序接受像 "\x0a\x04"
这样的输入。 p.send()
不会改变任何东西。这是我的测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char buf[24];
while(1) {
if(read(0,buf,16)==0) {
break;
}
}
read(0,16);
return 0;
}
我希望任何人都可以帮助我。
解决方法
这取决于连接类型。
如果是管道或套接字,除了关闭连接别无他法。
但是如果是伪终端(可以在pwntools中使用process(...,stdin=PTY)
强制执行),可以使用操作系统的终端行编辑功能(参见termios(3)
规范模式),您可以使用 p.send(b'\4')
(即 Ctrl+D)向其发送 EOF 标记。
所以你的最终代码应该是这样的:
from pwn import *
p = process('./test',stdin=PTY)
p.send(b'\4') # mind the b before binary data literal (text is not bytes)
# then something else maybe
p.interactive()