有没有办法将 r2pipe 显式连接到我打开的现有radare2 会话?

逆向工程 调试 雷达2 Python
2021-06-21 21:42:11

我知道我可以在会话中执行我的脚本[0x401000]> . server.py,并且当我r2pipe.open()不带参数调用时,管道将连接到它

理想情况下,我想在 python 中生成一个简单的 tcp 服务器,它等待来自客户端的特定命令。客户端是从实时 r2 会话中调用的,例如[0x401000]> . client.py --command doAnalysis. 该命令被传递到服务器,该服务器打开到我的 r2 会话的管道,执行分析,然后可能更新我的会话(实际上只是能够从我的 r2 会话未打开的服务器运行命令)。我要求服务器始终运行的原因是它会收集数据,而且我不想每次需要做一些分析时都重新收集这些数据。我无法从我的 r2 会话调用服务器,因为该会话将被服务器阻止。

如果服务器可以直接打开一个 r2pipe 到我的 r2 会话,那就太好了,但我不知道如何做到这一点,或者是否有可能。我尝试使用pickle 通过套接字发送r2 实例,但无法对其进行pickle。有什么想法吗?

1个回答

我不确定我是否完全理解你,但无论如何我都会试一试。

以下说明将解释如何实现这样的目标:|

在此处输入图片说明


radare2 带有自己的网络服务器。虽然乍一看似乎有点矫枉过正,但它实际上非常有用,尤其是当您想调试嵌入式系统或只是从远程终端执行命令时。

只需=h <port>使用任何 HTTP 客户端启动 Web 服务器并连接到它。

您可以使用以下命令打印此命令的帮助=h?

[0x00000000]> =h?
|Usage:  =[hH] [...] # http server
| http server:
| =h port       listen for http connections (r2 -qc=H /bin/ls)
| =h-           stop background webserver
| =h--          stop foreground webserver
| =h*           restart current webserver
| =h& port      start http server in background
| =H port       launch browser and listen for http
| =H& port      launch browser and listen for http in background

因此,让我们使用 oneliner 命令生成一个带有与我们心爱的会话的radare2 Web 服务器/bin/ls/

$ r2 -c=h /bin/ls
Starting http server...
open http://localhost:9090/
r2 -C http://localhost:9090/cmd/

好的,现在我们有一个 HTTP 服务器在一个开放的会话中运行,让我们连接到它。

你可以这样做curl

$ curl http://127.0.0.1:9090/cmd/?EHello,World!
 .--.     .--------------.
 | _|     |              |
 | O O   <  Hello,World! |
 |  |  |  |              |
 || | /   `--------------'
 |`-'|
 `---'

您甚至可以从您喜欢的浏览器执行此操作:

在此处输入图片说明

虽然它很酷,但它对您没有帮助——您要求使用 r2pipe 的解决方案。嗯……有!

什么是 r2pipe?

r2pipe API 基于在 r_core_cmd_str() 后面找到的单个 r2 原语,该函数接受描述要运行的 r2 命令的字符串参数并返回带有结果的字符串。

来源:r2pipe 存储库

您可能知道,使用 python,您可以使用“/bin/ls”执行import r2piper2pipe.open("/bin/ls")打开一个radare2会话。您知道可以使用 r2pipe 连接到远程 Web 服务器吗?对。

让我们编写一个快速脚本来做到这一点:

import r2pipe

print("[+] Connecting with python r2pipe")

r2_remote = r2pipe.open("http://127.0.0.1:9090")
command = "?E Welcome from server!"

while command != "stop":
    print (r2_remote.cmd(command))
    command = raw_input("r2cmd > ")

将脚本保存到poc.py您的驱动器上。

现在让我们r2 -c=h /bin/ls在一个终端和python poc.py另一个终端中运行

在此处输入图片说明

是的,radare2 也可以打印二维码。