我编写了一个C程序,该程序构造了ROP有效负载并将其发送到stdout。使用Radare2的调试模式,我如何将该输出通过管道传递给我尝试利用的二进制文件,该二进制文件接受stdin上的输入?例如,如果我编译的C程序是exp,而我正在利用的二进制文件是vuln,我想在Radare2的调试模式下执行./exp | ./vuln,这样我就可以看到我的有效负载如何损坏内存。问题,并仅介绍如何使用第二个端子进行输入/输出。

编辑:我暂时找到了一种解决方法,但是当我进行更改时重复做是很烦的。我首先将输出重定向到一个新文件./exp > exp.output,然后按如下所示制作一个rarun2脚本:

#!/usr/bin/rarun2
stdin=./exp.output


,然后我通过r2 -e dbg.profile=dbg.rr2 -d vuln进行运行。

#1 楼

这是一个很大的问题,很幸运,radare2提供了几种方法来实现这一目标。让我们看一下更基本,更直接的选项。

设置

首先,请确保运行最新的radare2。在撰写本文时,这是v4.3.1。雷达社区建议从源头构建radare2。在Linux系统上,这就像克隆存储库并执行以下命令一样简单:旧版本。

既然这部分已经过去了,我们可以继续解决方案。


准备测试程序

在下面的示例中,我编写了两个程序来演示我从一个程序动态传递到另一个程序的数据如何反映在其输出中。

repeater是一个接收用户输入并将其打印到console.Source:repeater.c



$ cd radare2
$ ./sys/install.sh


exp是一个将字符串打印到控制台的程序。Source:exp.c


#include <stdio.h>

int main() {

        char user_input[100];
        fgets (user_input, 100, stdin);
        printf ("[+] Received from STDIN: %s\n", user_input);

        return 0;
}


为了演示所需的行为,我们可以使用以下程序:

#include <stdio.h>

int main() {
        // print string, hex values, and the current UNIX time
        printf ("Hello, \x41\x42\xaf\xd7, %u", (unsigned)time(NULL));
        return 0;
}



方法0:rarun2配置文件

在radare2中,当它与调试对象进行交互时,rarun2是您的首选工具。


该程序用作启动器,用于运行具有不同环境,参数,权限,目录和覆盖的默认文件描述符的程序。源:man rarun2


虽然功能非常复杂且功能丰富,但我们将重点介绍与STDIO交互的基本功能之一。

从您的问题来看,您显然很熟悉rarun2配置文件的概念。当我使用rarun2将漏洞利用的输出传递给调试对象时,我使用的配置文件看起来像这样:

$ ./exp | ./repeater 
[+] Received from STDIN: Hello, AB��, 1583565405

$ ./exp | ./repeater 
[+] Received from STDIN: Hello, AB��, 1583565418


此rarun2配置文件将执行./exp程序并将该程序的输出设置为调试对象的标准输入。

然后,我们可以一次又一次地在radare2中快速执行该程序,而无需离开radare2 shell。 br />
首先,如上所述创建一个rarun配置文件。然后,在radare2中打开调试对象,并使用-r标志加载此配置文件:

以调试模式加载程序并使用dc执行它:
您可以看到,您进入了调试模式,并且该程序已通过exp程序的输出成功执行。您可以通过使用doo (as well as ood`)保持执行任意多次,该操作将“在带有args的调试模式下重新打开”。

$ cat profile.rr2 
#!/usr/bin/rarun2
stdin=!./exp



方法1:rarun2规则

幸运的是,您可以跳过rarun2文件的创建过程,而只是告诉radare2从何处获取标准输入。只需使用-R标志,然后加上rarun键和值,就可以轻松完成此操作。会话不会再次使用相同的stdin。但是,您可以利用doo命令并做一些技巧;)

$ r2 -r profile.rr2 -d repeater 
Process with PID 86588 started...
= attach 86588 86588
[0x7f89ba9b8100]> dc
[+] Received from STDIN: Hello, AB��, 1583567900



方法∞

还有其他方法进行这种设置的方式。由于时间太长,因此我会迅速记录下来。这里是一些想法:


使用反引号:dor甚至r2 -R "stdin=\"`python -c print(1234)`\"" -d repeater
使用其他终端的tty重定向STDIN。您可以通过执行r2 -R "stdin=\"`python -c 'print(1234)'`\"" -d repeater(其中x是tty编号)简单地将数据传递到tty。
使用./exp > dev/pts/X写入进程,或将输出重定向到/ proc // fd / 0
使用外部shell脚本自动执行您遇到的繁琐任务


#2 楼

作为暂时的解决方法,在有人给您正确答案之前,您可以使用像这样的bash脚本在一行中执行所需的操作:

#!/bin/bash 
gcc -o exp exp.c   #add another compiler options if you need
./exp > exp.output 
r2 -e dbg.profile=dbg.rr2 -d vuln


运行./nameOfScript.sh来编译和调试程序。

根据对此问题的评论,似乎您想要的功能尚未在radare2中实现,但是我可能错了...