Skip to content

Reserve

语言

高级语言-汇编语言-指令,分别经过编译和汇编操作。

1720324377456

  • 编译执行:上述通过编译器 (compiler) 将代码转化为机器指令格式的程序,进而执行
  • 解释执行:通过解释器 (interpreter) 将代码转化为 VM 格式的程序(如字节码),进而在 VM上执行

ELF

ELF 的编译、链接

  • 编译(汇编):从源代码到目标文件
  • 链接:从目标文件到可执行文件
Bash
gcc/clang hello.c

gcc的详细操作可看:https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

两种实现路径:

1720324699575

静态链接和动态链接:

1720324775557

许多程序需要访问相同的系统库,有两种方法可以做到这一点。一种解决方案是 静态链接 ,其中每个程序在编译时都会获得其可执行文件中包含的库的自己的副本。另一种方法是 动态链接 ,其中系统库的一个副本在每个程序之间共享,它们在运行时调用它,由操作系统提供便利。

ELF 的装载和运行

  • 可执行程序 (Program) 是静态,文件的概念
  • 进程 (Process) 是动态、系统运行时的概念(线程 :Thread)

静态链接程序:

内核以可执行文件 e_entry 位置 (即_start) 作为起点

https://elixir.bootlin.com/linux/latest/source/fs/binfmt_elf.c#L1225

动态链接程序:

内核以 interpreter 文件的 e_entry 位置作为起点

https://elixir.bootlin.com/linux/latest/source/fs/binfmt_elf.c#L1200

loader 负责解析和装载其他符号,进而再跳转到给定可执行文件的 _start

ELF 程序的交互、调试

通过命令行人工与程序交互:绝对路径 / 相对路径;通过虚拟机或者沙箱进行交互

https://fifirejail.wordpress.com/

https://github.com/google/nsjail

通过编程与程序交互:重定向构建特殊字符作为输入、C 管道编程、python subprocess 库、python pwntools 库。

ELF 程序的逆向

1720325266251

ELF 的静态逆向: 反汇编器与反编译器

反汇编:机器指令 => 汇编指令(查表、准确)objdump

反编译:汇编指令 => 编程语言(分析/特征匹配/启发式 … 、往往不准确)

IDA Pro (https://hex-rays.com/ida-pro/ )

Binary Ninja (https://binary.ninja )

Ghidra (https://github.com/NationalSecurityAgency/ghidra )

Cutter / radare (https://github.com/rizinorg/cutter )

大语言模型 ;D https://mlm.lingyiwanwu.com/

对于符号恢复的静态 or 动态链接目标:

  • 关注特定常量和字符串
  • 关注输入和输出函数

  • 关注分支、比较指令

  • 关注可能涉及加密解密的特殊运算(位运算、异或、取余)