我有一个静态链接的二进制文件,它被剥离了。当我在 IDA Pro 中加载它时,我没有看到预期的函数名称。
我在编译程序的Linux机器上为libc生成了sig文件,然后在IDA Pro中使用了这个sig文件,大部分函数名都解析了,但仍有少数函数没有解析。我想知道以下内容:
- 为什么即使我在编译程序的机器上使用了 libc 的 sig 文件,某些函数名称仍未解析?
- 如何解析所有函数名称?
我在下面的反汇编中标记了我希望使用 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 个功能得到解决。
然而,在主要子程序,scanf和printf功能都还没有解决。
如果有人想看一下静态编译的二进制文件,我已经在这里上传了:
https://www.sendspace.com/file/j9piey
谢谢。