因此,假设 ELF 二进制文件被剥离了 - 意味着没有符号表 - 并且该_start函数在调用之前不会推送 main 的地址__libc_start_main。
这发生在为 32 位和 64 位架构编译的二进制文件中,不知道为什么有时_start不推送绝对值而是推送寄存器值(如果有人知道,请告诉我)。
在这种情况下,有什么方法可以生成从 main 开始的二进制文件的调用图(没有名称)?有什么办法可以找到我的地址main吗?因为现在它在堆栈上压入一个寄存器值并且绝对地址main没有出现在任何指令中!
我已经添加了一个简单 C 程序的 32 位版本的启动例程示例,用 gcc 编译-m32 (本节中的 64 位版本有点相同,没有绝对地址)。
我不确定为什么我的一些 32 位程序在调用之前推送 main 的绝对地址,__libc_main_start而有些则没有。如果你知道答案,请告诉我。
00001070 <_start>:
1070: 31 ed xor ebp,ebp
1072: 5e pop esi
1073: 89 e1 mov ecx,esp
1075: 83 e4 f0 and esp,0xfffffff0
1078: 50 push eax
1079: 54 push esp
107a: 52 push edx
107b: e8 22 00 00 00 call 10a2 <_start+0x32>
1080: 81 c3 80 2f 00 00 add ebx,0x2f80
1086: 8d 83 50 d4 ff ff lea eax,[ebx-0x2bb0]
108c: 50 push eax
108d: 8d 83 f0 d3 ff ff lea eax,[ebx-0x2c10]
1093: 50 push eax
1094: 51 push ecx
1095: 56 push esi
1096: ff b3 f8 ff ff ff push DWORD PTR [ebx-0x8]
109c: e8 9f ff ff ff call 1040 <__libc_start_main@plt>
10a1: f4 hlt
10a2: 8b 1c 24 mov ebx,DWORD PTR [esp]
10a5: c3 ret
10a6: 66 90 xchg ax,ax
10a8: 66 90 xchg ax,ax
10aa: 66 90 xchg ax,ax
10ac: 66 90 xchg ax,ax
10ae: 66 90 xchg ax,ax