使用radare2反转剥离和静态链接的二进制文件

逆向工程 二元分析 小精灵 雷达2
2021-06-23 07:46:55

正如问题所说,我需要使用radare2. 这个二进制文件也是静态链接的。我已经通过使用IDA提供lscan.sig文件识别静态链接库并将其导入lscanIDA 以解析函数名称,从而在 IDA 中反转了它

我不知道如何将这些文件导入到radare2. 另外我不知道相同的解决方案是否适用于radare2.

1个回答

似乎lscan是为了与IDA. 但是,lscan基于FLIRT签名文件,它也可以由radare2 读取(请参阅此答案Zignatures部分)。您可以通过多种方式radare2来获得类似的结果:

将 IDA 数据库导入radare2

您可以使用radare2ida存储库中存在的简单脚本轻松地将IDC 和IDB 文件从IDA 导入radare2

该存储库包含一系列文档、脚本和实用程序,可让您使用 IDA 和 R2,将项目元数据从一种工具转换为另一种工具,并提供以更有用的方式集成它们的工具。

从 IDA 导出

要将 IDA 数据库导出到 IDC 文件,请单击 File >> Produce file >> Dump databse to IDC file...

要将当前数据库保存为 IDB 文件,请单击File >> Take database snapshot...或使用快捷方式Ctrl+ Shift+W

导入到 Radare2

要将 IDC 元数据导入radare2,请使用附带的idc2r.pyradare2ida

idc2r.py file.idc > file.r2

该命令读取从 IDA Pro 数据库导出的 IDC 文件并生成包含相同注释、函数名称等的 r2 脚本。您可以file.r2使用.radare的 dot命令导入结果

[0x00000000]> . file.r2

.命令用于解释来自外部来源的雷达命令,包括文件和程序输出。例如,要省略中间文件的生成并直接导入脚本,您可以使用以下组合:

[0x00000000]> .!idc2r.py < file.idc

字形

radare2 有自己的签名格式,称为Zignatures,允许加载/应用和动态创建签名。它们在z命令命名空间下可用

[0x00000000]> z?
|Usage: z[*j-aof/cs] [args] # Manage zignatures
| z            show zignatures
| z*           show zignatures in radare format
| zj           show zignatures in json format
| z-zignature  delete zignature
| z-*          delete all zignatures
| za[?]        add zignature
| zo[?]        manage zignature files
| zf[?]        manage FLIRT signatures
| z/[?]        search zignatures
| zc           check zignatures at address
| zs[?]        manage zignspaces

zf每当您处理 FLIRT 签名时子命令都会很方便。因此,您可以从文件中导入 FLIRT 签名:

[0x00000000]> zf?
|Usage: zf[dsz] filename # Manage FLIRT signatures
| zfd filename  open FLIRT file and dump
| zfs filename  open FLIRT file and scan
| zfz filename  open FLIRT file and get sig commands (zfz flirt_file > zignatures.sig)

不管 FLIRT,您还可以使用zos [filename]fromradare2 将签名转储到 sdb 文件并zo [filename]加载它。

源代码

list命令类似dgb,radare 允许您打印源代码文件中的行。下面是一个例子:

$ gcc -m32 -g megabeets.c -o megabeets.bin
$ r2 megabeets.bin
[0x08048420]> aa
[x] Analyze all flags starting with sym. and entry0 (aa)
[0x08048420]> s main
[0x080486cd]> CL
file .//megabeets.c
line 36
  022
  023  int main(int argc, char *argv[])
> 024  {
  025      char *input;
  026      puts("Megabeets\n");

C命令用于管理注释和数据转换。您可以定义要解释为代码、二进制数据或字符串的程序字节范围。还可以在每个指定的标志位置执行外部代码,以便从外部文件或数据库中获取一些元数据,例如评论。


要了解更多信息,我建议您阅读: