温馨提示×

linux反汇编如何找入口

小樊
72
2026-09-03 09:16:55
栏目: 智能运维

在 Linux 下做反汇编并找程序入口,通常分几种情况:ELF 程序入口(_start)、main 函数入口、以及动态/静态分析时的入口点。下面按常见场景说明。


一、ELF 程序的真正入口(_start)

Linux 下可执行文件(ELF)的第一条执行的指令并不是 main,而是 _start(由 libc 或汇编启动代码提供)。

1. 用 readelf 看入口地址

readelf -h ./a.out

看:

Entry point address:               0x401000

这就是 程序入口虚拟地址(Entry Point)。


2. 用 objdump 反汇编并定位 _start

objdump -d ./a.out | less

搜索:

<_start>:

或者:

objdump -d ./a.out | grep -A 20 "<_start>:"

通常 _start 会:

  • 设置栈
  • 调用 __libc_start_main
  • 最终调用 main

二、找 main 函数(高级语言程序)

方法 1:从 _start 回溯

在 _start 中常见:

call   __libc_start_main

main 通常作为第一个参数传入:

mov    rdi, main

方法 2:用符号表(有调试信息)

nm ./a.out | grep main

或:

objdump -t ./a.out | grep main

方法 3:GDB 直接停在 main

gdb ./a.out
(gdb) break main
(gdb) run

然后用:

(gdb) disassemble

即可看到 main 的反汇编。


三、无符号 / stripped 程序怎么办?

如果程序被 strip:

file ./a.out
# stripped

1. 仍可用 Entry Point

readelf -h ./a.out

反汇编:

objdump -d ./a.out | less

跳到 Entry 地址。


2. 特征识别 main

  • 大量函数调用
  • 字符串引用(puts, printf)
  • 参数压栈模式

四、内核 / 模块 / 裸机情况(补充)

Linux 内核

  • 入口通常是 startup_64 / start_kernel
objdump -d vmlinux | grep startup

用户态 shellcode

  • 入口就是第一条指令(无 ELF 头)

五、推荐工具组合

目的 工具
看入口地址 readelf -h
反汇编 objdump -d
动态调试 gdb
符号 nm
高级分析 radare2 / Ghidra

如果你愿意,可以告诉我:

  • 是 C / C++ / 汇编 / shellcode
  • 是否 stripped
  • 用 x86 / x64 / ARM

我可以给你具体命令和示例反汇编分析。

0 踩