如何帮助 IDA 自动完成 libc 功能?

逆向工程 艾达 反编译 六线谱
2021-06-18 17:43:30

我有一个静态编译的 x86_64 ELF 二进制文件。通过一些挖掘,我发现 C 库是 musl。在 IDA Pro 7.0 中,反编译的伪代码将 sycall 显示为内联汇编代码。但在最新的 IDA Pro 7.3.x 中,它显示为不完整的功能。fork()为例:

  • 在组装中:
mov eax, 57
syscall
  • 在 IDA Pro 7.0 中:
__asm { syscall; LINUX - sys_fork }
  • 在 IDA Pro 7.3.x 中:
sys_fork()

所以,有一些改进:)

我希望 IDA 自动解析函数参数和返回值。在 Windows 世界中,我通过创建类型库做了类似的事情有没有办法在 IDA 中导入整个 C 库(musl 或 glibc)而无需手动编辑每个 libc 函数?

2个回答

以下是使用Igor Skochinsky 的回答所需的步骤

  • 克隆 musl git 存储库:
git clone --depth=1 git://git.musl-libc.org/musl
  • 编译代码:
cd musl; ./configure; make -s -j2
  • 从 IDA SDK 中提取 Flair 工具。pelf使用上面步骤编译的 musl 静态库运行(ELF 解析器):
cd ./lib
~/flair/bin/linux/pelf libc.a

输出将类似于以下内容:

Fatal [/mnt/c/MyFiles/libc.a] (__init_tls.lo): Unknown relocation type 42 (offset in section=0x3a).
  • 要修复不受支持的重定位错误,请pelf使用以下-r选项运行
./flair/bin/linux/pelf -r42:58:0 libc.a musl.pat

-r选项被指定为-rN:O:L其中 N 是重定位类型,在距重定位地址的偏移量 O 处标记为变量 L 字节。这将创建一个 PAT 文件。

  • 现在运行sigmake以创建 Flair 签名文件:
./flair/bin/linux/sigmake -n musl musl.pat musl.sig

如果输出未显示任何警告,则 SIG 文件正常。但是如果与函数签名有任何冲突,输出将如下所示:

libc.sig: modules/leaves: 1550/1775, COLLISIONS: 41

要减轻错误,请从musl.exc碰撞文件中删除注释然后sigmake再次运行上面的命令。将有一个musl.sig文件可以从文件 > 加载文件 > FLIRT 签名文件导入 IDA Pro。

FLIRT 签名取决于 C/C++ 编译器就我而言,它是叮当声。我在异常处理函数中找到了它。会有一个像CLNGC++\0. 在 IDA 的字符串窗口中找不到该字符串。所以,首先要找到异常处理函数。诀窍是只要返回错误值就会调用该函数。

即使在像 musl 这样的最小库中,内联系统调用也很少单独使用。通常在 syscall 周围有包装函数,这实际上是在二进制文件中结束的。因此,您可以使用 FLAIR 工具包从 musl 的静态库生成 FLIRT 签名,然后将该签名应用于您的二进制文件。通过这种方式,您应该可以识别所有包装函数,这些函数与标准类型库之一结合,应该为您提供 C 库函数的名称和参数。