IDA 在 C std 库调用(memset、memcpy 等)上显示 MEMORY 或未知引用

逆向工程 艾达 x86 linux 记忆 图书馆
2021-06-15 04:04:54

我目前正在反转 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 调用在这里,但内存偏移指向可执行文件的下一个地址。

0个回答
没有发现任何回复~