/* C语言代码如下 */
int add(int a, int b)
{
return (a+b);
}
int main(int argc, char *argv[])
{
int a = 10;
int b = 20;
int result = 0;
result = add(1, 2);
result = add(a, b);
return 0;
}
/* -------------------------------------- */
使用如下命令生成可执行文件“main_32bit_exe”:
gcc -m32 -c main.c -o main_32bit.o
ld -m elf_i386 -s main_32bit.o -o main_32bit_exe
通过如下命令获得其反汇编代码:
objdump -d -M intel main_32bit_exe
08048094 <.text>:
8048094: 55 push ebp
8048095: 89 e5 mov ebp,esp
8048097: e8 5b 00 00 00 call 0x80480f7 **; 调用了一个未知的匿名函数(且没有任何意义)**
804809c: 05 64 1f 00 00 add eax,0x1f64
80480a1: 8b 55 08 mov edx,DWORD PTR [ebp+0x8]
80480a4: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]
80480a7: 01 d0 add eax,edx
80480a9: 5d pop ebp
80480aa: c3 ret
80480ab: 55 push ebp
80480ac: 89 e5 mov ebp,esp
80480ae: 83 ec 10 sub esp,0x10
80480b1: e8 41 00 00 00 call 0x80480f7
80480b6: 05 4a 1f 00 00 add eax,0x1f4a
80480bb: c7 45 f4 0a 00 00 00 mov DWORD PTR [ebp-0xc],0xa
80480c2: c7 45 f8 14 00 00 00 mov DWORD PTR [ebp-0x8],0x14
80480c9: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0
80480d0: 6a 02 push 0x2
80480d2: 6a 01 push 0x1
80480d4: e8 bb ff ff ff call 0x8048094
80480d9: 83 c4 08 add esp,0x8
80480dc: 89 45 fc mov DWORD PTR [ebp-0x4],eax
80480df: ff 75 f8 push DWORD PTR [ebp-0x8]
80480e2: ff 75 f4 push DWORD PTR [ebp-0xc]
80480e5: e8 aa ff ff ff call 0x8048094
80480ea: 83 c4 08 add esp,0x8
80480ed: 89 45 fc mov DWORD PTR [ebp-0x4],eax
80480f0: b8 00 00 00 00 mov eax,0x0
80480f5: c9 leave
80480f6: c3 ret
80480f7: 8b 04 24 mov eax,DWORD PTR [esp]
80480fa: c3 ret
通过分析该汇编代码可知
地址 0x08048094 处对应 C 语言源代码中的 add() 函数
地址 0x080480ab 处对应 C 语言源码中的 main() 函数
但是地址 0x080480f7 处是一个未知函数,且它在(汇编版) add() 函数中被调用了,可是
通过分析发现该函数没有任何意义,不知此处为什么要调用这样一个函数?