我使用radare2(2.2.0)和r2pipe(0.9.5)为python3调试生成的代码:
#include <stdio.h>
int main(){
char entrada[14];
gets(entrada);
puts(entrada);
return 0;
}
用radare2输出拆解main函数:
0x00400546 55 pushq %rbp
0x00400547 4889e5 movq %rsp, %rbp
0x0040054a 4883ec10 subq $0x10, %rsp
0x0040054e 488d45f0 leaq local_10h, %rax
0x00400552 4889c7 movq %rax, %rdi
0x00400555 b800000000 movl $0, %eax
0x0040055a e8e1feffff callq sym.imp.gets ; char*gets(char *s)
0x0040055f 488d45f0 leaq local_10h, %rax
0x00400563 4889c7 movq %rax, %rdi
0x00400566 e8c5feffff callq sym.imp.puts ; int puts(const char *s)
0x0040056b b800000000 movl $0, %eax
0x00400570 c9 leave
0x00400571 c3 retq
但是,当使用此脚本使用 python 调试此程序时
import r2pipe as r2
prog = r2.open("./a.out")
prog.cmd("aaa")
prog.cmd("doo")
prog.cmd("db 0x0040055f") #Breakpoint after 'gets' call
prog.cmd("dc")
prog.cmd("dc")
无论我使用哪个输入,执行都停留在“gets”调用中。相同的命令序列适用于radare2 的CLI。我使用也尝试dor stdin=input.txt之前doo它,尽管它的工作原理实际上,它是不是方便地将文件写入磁盘,以及用于某些应用是无法确定执行之前所需要的输入。
在 r2pipe 中使用 stdin 的最佳方法是什么?