无法解析 IDA Pro 中静态链接二进制文件的符号

逆向工程 艾达 小精灵
2021-06-21 15:41:26

我有一个静态链接的二进制文件,它被剥离了。当我在 IDA Pro 中加载它时,我没有看到预期的函数名称。

我在编译程序的Linux机器上为libc生成了sig文件,然后在IDA Pro中使用了这个sig文件,大部分函数名都解析了,但仍有少数函数没有解析。我想知道以下内容:

  1. 为什么即使我在编译程序的机器上使用了 libc 的 sig 文件,某些函数名称仍未解析?
  2. 如何解析所有函数名称?

我在下面的反汇编中标记了我希望使用 sig 文件解决的函数:

push    rbp
mov     rbp, rsp
sub     rsp, 20h
mov     [rbp+var_14], edi
mov     [rbp+var_20], rsi
mov     [rbp+var_8], 0
mov     [rbp+var_4], 0
lea     rax, [rbp+var_8]
mov     rsi, rax
mov     edi, offset unk_4937E4
mov     eax, 0
call    sub_407FF0  // should be scanf function
mov     edx, [rbp+var_8]
mov     eax, [rbp+var_8]
imul    eax, edx
mov     [rbp+var_4], eax
mov     eax, [rbp+var_4]
mov     esi, eax
mov     edi, offset aTheResultIsD ; "the result is: %d\n"
mov     eax, 0
call    sub_407EC0 // should be printf function
mov     eax, 0
leave
retn

具体来说,函数 scanf 和 printf。

现在,为了生成 sig 文件,我使用了 IDA Pro 的 flair 工具,在 Linux 机器上,我使用以下命令生成:

./pelf /usr/lib/x86_64-linux-gnu/libc.a libc.pat

./sigmake libc.pat libc.sig

从 sigmake 生成的 exc 文件中,我删除了前 4 行:

;--------- (delete these lines to allow sigmake to read this file)
; add '+' at the start of a line to select a module
; add '-' if you are not sure about the selection
; do nothing if you want to exclude all modules

__iswctype                                          32 49F3 31C04885F674498B0E89FAD3EA3B5604733E83C2058B149685D274348B4E0841
__iswctype_l                                        32 49F3 31C04885F674498B0E89FAD3EA3B5604733E83C2058B149685D274348B4E0841

__chk_fail                                          00 0000 4883EC08BF........E8............................................
__stack_chk_fail                                    00 0000 4883EC08BF........E8............................................

然后,我再次运行 sigmake 以生成 sig 文件:

./sigmake libc.pat libc.sig

然后,我将这个 sig 文件放在 IDA Pro 的 sig 文件夹中并应用了签名(IDA pro 中的 Shift + F5)。现在,783 个功能得到解决。

然而,在主要子程序,scanfprintf功能都还没有解决。

如果有人想看一下静态编译的二进制文件,我已经在这里上传了:

https://www.sendspace.com/file/j9piey

谢谢。

1个回答
  1. 您解析的库与二进制文件不完全匹配。根据库/模式中的字节检查二进制文件中的字节。
  2. 还有一些其他问题阻止匹配签名。您可以使用-z4switch运行 IDA以查看 FLIRT 处理期间额外的调试输出,它可能会提供一些线索。