Chapter 3 - Reverse

程序与可执行文件

高级语言的编译过程

image24ee6ba620767297.png

编译执行 / 解释执行

  • 编译执行: 通过编译器 compiler 将代码转换为机器指令格式的程序

    image2faf10d15896ae17.png

  • 解释执行: 通过解释器 interpreter 将代码转换为 VM 格式的程序, 跑在 VM 上

    image-1c47e7e2554625053.png

ELF

ELF (Executable and Linkable Format) 是 Linux 系统下的用户态可执行文件

可以通过命令行工具静态检视 ELF 文件

file
objdump
readelf

ELF 的编译与链接

Take C for example

编译: from source code (.c) to .o
链接: from .o to executable file (.elf)

预处理

gcc/clang -E hello.c -o hello.c.i
  • 头文件包含
  • 宏展开 & 替换

编译

gcc -S hello.c -o hello.s

-S: Compile only, do not assemble or link
-Ox: 优化等级
-g: 启用调试

编译前端

生成 clang AST (抽象语法树)
clang -Xclang -ast-dump -S hello.c

生成 LLVM IR
clang -Xclang -emit-llvm -S hello.c -o hello.ll

编译后端

as hello.s -o hello.o

hello.c --(gcc/clang)–> hello.s --(as/llvm-mc)–> hello.o

ELF 的装载与运行

ELF 的交互与调试

ELF 的逆向