使用两个终端使用radare2进行调试

逆向工程 调试 linux 雷达2
2021-07-02 02:17:30

一段时间以来,我一直试图解决这个问题,并且确实需要一些帮助。首先介绍一下:

我正在 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和两个终端调试这个程序,我在终端窗口中运行radare2并在终端窗口中T1输入/输出程序T2经过一些研究,我认为这可能应该在rarun2工具的帮助下完成

因此,对于我的第一次尝试,我阅读了rarun2手册页,特别是将 IO 重定向到另一个终端的部分,并在我创建以下文件时识别了T2终端/dev/pts/17test.rr2

#!/usr/bin/rarun2
stdio=/dev/pts/17

T2然后终端中运行sleep 999999,在终端中T1运行r2 -R test.rr2 -d a.out,当dc在radare2 中执行命令时,程序输入/输出在终端中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,但是在radare2 中调试的过程是 rarun2 工具,由于我对 Linux 和逆向工程的了解不是很好,我真的不知道如何继续调试a.out过程。

所以,总而言之,如果有人可以在这里分享这种调试是否可以用radare2完成,如果可以,如何实现,我将不胜感激?我也尝试过 using nc,但我没有在这个主题上取得任何进展。

1个回答

它实际上非常简单,对我来说很好用,正如您在以下 gif 中看到的那样:

直接链接


首先,您需要确定tty要重定向STDIO到的终端(又名 Terminal 2, T2)。您可以通过简单地执行来做到这一点:

$ tty
/dev/pts/2

tty将很快用于rarun2配置文件。与此同时,让我们把T2睡觉用sleep 999999

移至Terminal 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给我们输出并要求我们的输入:

Enter a number:

在我们向它发送一个数字后,我们在T1上的断点命中:

hit breakpoint at: 400580
[0x00400580]>

我们现在可以使用 继续执行dc,循环将永远继续,标准输入和输出将在 T2 中。