在 Linux 下做反汇编并找程序入口,通常分几种情况:ELF 程序入口(_start)、main 函数入口、以及动态/静态分析时的入口点。下面按常见场景说明。
Linux 下可执行文件(ELF)的第一条执行的指令并不是 main,而是 _start(由 libc 或汇编启动代码提供)。
readelf 看入口地址readelf -h ./a.out
看:
Entry point address: 0x401000
这就是 程序入口虚拟地址(Entry Point)。
objdump 反汇编并定位 _startobjdump -d ./a.out | less
搜索:
<_start>:
或者:
objdump -d ./a.out | grep -A 20 "<_start>:"
通常 _start 会:
__libc_start_mainmain_start 回溯在 _start 中常见:
call __libc_start_main
main 通常作为第一个参数传入:
mov rdi, main
nm ./a.out | grep main
或:
objdump -t ./a.out | grep main
gdb ./a.out
(gdb) break main
(gdb) run
然后用:
(gdb) disassemble
即可看到 main 的反汇编。
如果程序被 strip:
file ./a.out
# stripped
readelf -h ./a.out
反汇编:
objdump -d ./a.out | less
跳到 Entry 地址。
puts, printf)startup_64 / start_kernelobjdump -d vmlinux | grep startup
| 目的 | 工具 |
|---|---|
| 看入口地址 | readelf -h |
| 反汇编 | objdump -d |
| 动态调试 | gdb |
| 符号 | nm |
| 高级分析 | radare2 / Ghidra |
如果你愿意,可以告诉我:
我可以给你具体命令和示例反汇编分析。