r2pipe 不会像二进制文件在 r2 调试器模式下那样提示用户输入

逆向工程 二元分析 雷达2
2021-07-12 06:25:24

有一个正常运行的 r2pipe 脚本,但需要点击 crtl-c 以在断点附近继续(不是主要问题),但是当破解程序要求用户输入时,脚本不会像在常规 r2 命令行中那样暂停输入. 将输入发送到二进制文件的最佳方式是什么?在可执行文件的末尾附近需要此输入树。即使是第一个也无法管理它来提示。除了输入问题外,脚本没有问题。

import r2pipe
r = r2pipe.open('crackme, flags=['-d'])
r.cmd('e dbg.profile=robot.rr2')
r.cmd('db 0x080486d8;') 
print(r.cmd('dc'))
print(r.cmd('dc'))
sep=' '

value1=int(r.cmd('? [ebp+0xc];').split(sep, 1)[0])
value2=int(r.cmd('? [ebp+0x10];').split(sep, 1)[0])
hex_operator=r.cmd('dr eax')
operator=r.cmd('? '+(hex_operator))

if '+' in operator:
    answer=value1+value2

elif '-' in operator:
    answer=value1-value2

print(r.cmd('dc'))

应该在此处提示输入,但执行仅在“密码是什么”之后结束,或者如果我输入没有 r2pipe 开头的 r2 命令: r2 -d crackme -c "e dbg.profile=robot.rr2" 它确实提示我输入但 rr2 仍然没有输入 input.txt 中的内容

在我的 .rr2 中:

#!/usr/bin/rarun2

试过

input=input.txt 

stdin=input.txt

input.txt 只是一个字符串

是否可能 rarun 的输入或标准输入指令不兼容或什么的?

1个回答

我认为您使用的是 r2 的一些旧版本,所以我的回答不会解决这个问题并向您展示如何使用最新版本来做到这一点。

问题在于您的第一行,或者错误的假设,即启动调试会话并应用 rarun2 文件将自动应用。不是。

因此,不要像这样连接到 r2 引擎,r = r2pipe.open('crackme', flags=['-d'])而是这样

r = r2pipe.open('crackme') #no debugging flag
r.cmd('e dbg.profile=robot.rr2')
r.cmd('ood') #reopen the file in debug mode - this will apply the dbg.profile settings
...

使用这种方法,它将正确地将 rr2 中的设置映射到调试会话,如果您输入 input.txt,它将通知该文件不存在(它将其视为文件)。

但即使采用这种方法,这个crackme 也会对难以遵循的流进行一些奇怪的修改。但至少有了这个改变,你就可以继续调查了。