使用 r2pipe 进行调试时使用 stdin

逆向工程 雷达2
2021-07-10 21:20:04

我使用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 的最佳方法是什么?

1个回答

只需在命令中使用 ie 伪终端作为文件即可。我通常创建rarun2文件

#!/usr/bin/rarun2
stdin=/dev/pts/20

在我运行的 r2pipe 脚本中

r2.cmd('e dbg.profile=re2.rr2')

通过r2调试会话配置此脚本的使用

然后,在一个终端上运行你的r2pipe,在另一个(那个是/dev/pts/20)你输入

echo "<input>" > /dev/pts/20