fnknda/cryptorave26
GitHub: fnknda/cryptorave26
通过滥用 ELF 动态重定位机制在程序加载时覆写代码段,实现对抗静态分析和动态调试的代码混淆技术 PoC。
Stars: 0 | Forks: 0
# 利用重定位在 ELF 文件中进行代码混淆
本仓库包含了在 2026 年 5 月 9 日 [Cryptorave 2026](https://cpa.cryptorave.org/cryptorave-2026/talk/R9ZKB7/) 大会演讲中展示的相关资料。
## 关于
本研究探讨了一种针对 x86-64 ELF 二进制文件的代码混淆技术,该技术滥用了 *runtime linker* (`ld.so`) 的动态重定位机制。
其核心思想非常简单:利用 `SHT_RELA` 节中的条目,在程序控制权转交给主程序**之前**的运行时刻覆写 `.text` 代码段。最终生成的可执行文件,其实际行为只有在运行时才会显现,从而大大增加了静态和动态分析的难度。
### 技术亮点
- 被混淆的代码永远不会以静态形式出现在最终的二进制文件中
- 调试器(如 GDB)的断点会在加载时被覆写
- 反混淆过程甚至在程序的第一条指令执行前就已经完成
## 仓库文件
```
code.s # Código original, payload: write("Hello, world!\n", 14)
evil.s # Código que será encodado na relocação, payload: execve("/bin/sh", 0, 0)
Makefile
README.md
relocation.asm # Gerador de ELFs em ASM
relocation.c # Gerador de ELFs em C, com geração dinâmica das sessões SHT_RELA
slide.pdf # Slides da palestra
```
## 使用方法
### 前置条件
- 配备 glibc 的 Linux x86-64 环境
- Vim(提供 `xxd` 程序)
- NASM(用于编译 `code.s`、`evil.s` 和 `relocation.asm` 文件)
- GDB(用于观察断点受到的影响)
### 生成混淆示例
```
make
```
### 观察技术效果
#### `asm.out`
```
# 在 GDB 中打开二进制文件 asm.out
# 开始执行
gdb ./asm.out
(gdb) run # Iniciar o programa
# 程序将在第一条指令处中断
# 原始代码(一个简单的 hello world)的前八个字节已被覆盖
# payload 是一个 int3 (0xcc)
```
#### `c.out`
```
# 在 GDB 中打开二进制文件 c.out
# 开始执行,尝试在第一条指令处放置一个 breakpoint
gdb ./c.out
(gdb) set disassembly-flavor intel # Opcional: Utilizar sintaxe Intel para o disassembly
(gdb) starti # Iniciar o programa e parar na primeira instrução
(gdb) info proc mappings # Pegar o endereço virtual inicial (vaddr) do nosso executável
(gdb) info files # Pegar o offset do Entry Point (entry)
(gdb) print + # Salvar o endereco do entry point em $1
(gdb) x/10i $1 # Verificar se o código original (code.s) se encontra no endereço
(gdb) break *$1 # Colocar um breakpoint na primeira instrução
(gdb) continue
# breakpoint 将被 relocation 覆盖
# 程序继续执行,未停止
# payload 是一个简单的 execve("/bin/sh", 0, 0)
```
## 工作原理(简述)
1. **最小 ELF**:我们创建了一个仅包含 `ld.so` 处理所需必备节 (section) 的 ELF 二进制文件
2. **隐藏的恶意代码**:“真正”的代码作为数据存储在 `SHT_RELA` 中(位于 `r_addend` 字段内)
3. **重定位**:使用 `R_X86_64_SIZE64` 类型的重定位条目来存储这些字节,并在运行时完成复制
4. **执行顺序**:重定位操作会在将执行权交给程序之前,替换 **entry point** 处的原始指令
```
ANTES da carga (estático) DEPOIS da carga (dinâmico)
+----------------------+ +----------------------+
| .text com lixo | | .text reescrito |
| (código original) | ld.so | (código malicioso) |
+----------------------+ --------> +----------------------+
| SHT_RELA | | SHT_RELA consumida |
| (esconde o payload) | | (ainda legível) |
+----------------------+ +----------------------+
```
## 参考文献及相关工作
- [ELF Binary Mangling Series](https://n0.lol/ebm/) - 引领我入门 ELF 格式的系列文章
- [Implementing the PT_NOTE Infection Method in x64 Assembly](https://tmpout.sh/1/2.html) - 介绍使用 Entry Point Obscuring (EPO) 在 ELF 文件中进行混淆的文章
- [A short note on entrypoint obscuring in ELF binaries](https://tmpout.sh/2/2.html) - 首次介绍 ELF 文件动态类型 (ET_DYNAMIC) 的文章
- [Relocation Revelation: Unpacking the Secrets of ELF](https://tmpout.sh/4/4.html) - 重定位入门介绍,也是本次演讲的灵感来源
- [glibc - elf/elf.h](https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/elf.h;h=46a01281cb0fb5322d5124f0443c11dea4d5b721;hb=f762ccf84f122d1354f103a151cba8bde797d521) - git 上的 glibc v2.43 源码
- [glibc - elf/rtld.c](https://elixir.bootlin.com/glibc/glibc-2.43/source/elf/rtld.c) - bootlin 上的 glibc v2.43 源码
- [Oracle Linker and Libraries Guide - Capítulo 7](https://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblh/index.html) - ELF 格式规范(针对 Solaris 系统,但同样适用于 x86-64)
- [elf_rela_obfuscation](https://github.com/ulexec/elf_rela_obfuscation) — 受 relobfuscate 启发的 PoC
- [relobfuscate](https://github.com/peding/relobfuscate) — 利用 ELF 重定位的类似技术
标签:ASM, Cryptorave, DOM解析, ELF, GDB, NASM, SHT_RELA, x86-64汇编, 中高交互蜜罐, 二进制分析, 云安全运维, 云资产清单, 代码混淆, 动态分析绕过, 动态重定位, 反调试, 安全会议, 安全技术分享, 客户端加密, 底层安全, 恶意软件开发, 数据展示, 系统底层, 红队, 网络安全, 运行时链接器, 逆向工程, 隐私保护, 静态分析绕过