我正在64位Ubuntu 16.04上运行来自Github的最新版本的radare2,并具有以下示例程序
r2_test.cpp
:#include <cstdio>
int main(int argc, char* argv[])
{
int num;
while (1)
{
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d\n", num);
}
return 0;
}
我要实现的目标是,使用radare2和两个终端调试该程序,方法是在终端窗口
T1
中运行radare2,并在终端窗口T2
中输入/输出程序。经过一些研究,我认为应该可以借助rarun2
工具来完成此操作。 因此,我第一次尝试阅读rarun2的手册页,特别是将IO重定向到另一个终端的部分,并在将
T2
终端标识为/dev/pts/17
之后,创建了以下test.rr2
文件: #!/usr/bin/rarun2
stdio=/dev/pts/17
在
T2
终端中,我然后运行sleep 999999
,在终端T1
中,我运行r2 -R test.rr2 -d a.out
,当在radare2内部执行命令dc
时,程序输入/输出在终端T1
中,而不是我想要的我也尝试过使test.rr2
相等的变化#!/usr/bin/rarun2
stdin=/dev/pts/17
stdout=/dev/pts/17
或
#!/usr/bin/rarun2
stdio=/dev/pts/17
stdin=/dev/pts/17
stdout=/dev/pts/17
,但结果总是
在我第二次尝试后,经过研究和阅读,我尝试通过以下方式运行radare2:
r2 -d rarun2 program=a.out stdio=/dev/pts/17
。这样,我就实现了将IO重定向到终端T2
的功能,但是在radee2内部调试的过程是rarun2工具,并且由于我对Linux及其反向工程的了解并不好,所以我真的不知道该如何进行因此,总而言之,如果有人可以使用radare2进行这种调试,并且如果可以的话,如何实现呢?我也使用
a.out
进行了尝试,但是在该主题上我没有取得任何进展。#1 楼
实际上,它非常简单,并且对我有用,如以下gif所示:首先,您需要弄清楚以下内容的
tty
您要将STDIO
重定向到的终端(也称为T2终端2)。只需执行以下操作即可:
$ tty
/dev/pts/2
此
tty
即将推出可以在rarun2
配置文件上使用。同时,让我们使用
sleep 999999
将T2睡眠。 移动到1号终端,让我们创建一个简单的
rarun2
配置文件,其中包含以下内容:#!/usr/bin/rarun2
stdio=/dev/pts/2
我们配置了
stdio
来传输标准输入并输出到T2。现在让我们使用刚刚创建的配置文件执行程序:
$ r2 -e dbg.profile=profile.rr2 -d a.out
Process with PID 14074 started...
= attach 14074 14074
bin.baddr 0x00400000
Using 0x400000
Assuming filepath /tmp/re/a.out
asm.bits 64
-- Mind that the 'g' in radare is silent
[0x7f9654e0fd80]>
(可以使用以下方法完成:
r2 -r profile.rr2 -d a.out
)该程序已在调试模式下成功加载。现在仅作为示例,让我们在第二次调用
printf
时设置一个断点,然后使用dc
启动程序。在gif中,我没有创建断点。[0x7f9654e0fd80]> db 0x00400580
[0x7f9654e0fd80]> dc
Selecting and continuing: 14074
现在T2给我们输出,并要求我们输入: />
向我们发送一个数字后,我们会在T1命中点上设置断点:标准输入和输出将在T2中。
评论
好的,所以问题在于Sublime不会自动向我的profile.rr2文件中添加“换行符”。另外,我只尝试了-R选项,并且它不起作用。我仍然不明白为什么它不适用于-R但适用于-e dbg.profile = ...无论如何,我现在知道如何使它起作用,非常感谢。如果有时间,可以用-R检查它是否对您有用。
– ubnix
17年9月28日在9:47
就像我在帖子中提到的那样,它可以与-R一起使用:)我检查了几次。很高兴我能够提供帮助!
–巨型甜菜
17年9月28日在9:50
+1 gif演示,非常清晰
–zipzip
19 Mar 5 '19在15:23