我目前正在反转 Linux 32 位可执行文件(其中包含一个静态链接库),但我遇到了一个小问题,找不到解决方案。
基本上,每当我偶然发现 glibc 调用(memset、memcpy 等)IDA 时,它不会显示函数的正确名称,而是显示对 MEMORY 的引用作为函数调用。
例子:
MEMORY[0xACFC3F9F](s, 0, 44); // <----- memset
MEMORY[0xACFC3FBD](dest, 0, 40); // <---- memset
有趣的部分是,当调试引用更改为实际函数调用时(仍然未知,但无论如何)。调试时 MEMORY 部分更改为:
((void (__cdecl *)(char *, _DWORD, signed int))unk_F769B4F0)(s, 0, 44);
((void (__cdecl *)(char *, _DWORD, signed int))unk_F769B4F0)(dest, 0, 40);
在Ghidra 中,相同的代码如下所示:
memset(s,0,0x2c); // <--- correct function name
memset(dest,0,0x28); // <--- correct function name
IDA 应该自动检测 std 库函数,它在这里没有发生的原因是什么?
更新:我从头开始重新分析了可执行文件(创建一个新的 IDA 数据库),对函数的引用在这里。
不幸的是,在附加到调试器之后,所有的函数调用又变成了“MEMORY”。
这是汇编:
.text:566146D7 mov [esp], eax ; s
.text:566146DA call near ptr memset+566146DBh ; <--- memset call
.text:566146DF mov dword ptr [esp+8], 28h ; '(' ; n
.text:566146E7 mov dword ptr [esp+4], 0 ; c
.text:566146EF lea eax, [ebp+dest]
.text:566146F5 mov [esp], eax ; s
.text:566146F8 call near ptr memset+566146F9h ; <--- memset call
.text:566146FD movsx eax, [ebp+var_14C]
memset 调用在这里,但内存偏移指向可执行文件的下一个地址。