vmsplit/nebula
GitHub: vmsplit/nebula
一个为 Linux ARM64 提供位置无关 shellcode 模板与运行时符号解析的轻量框架,解决在资源受限或特定架构上灵活注入系统调用的难题。
Stars: 30 | Forks: 4
# nebula **arm64 linux position-independent shellcode framework**
## 为什么 没有适用于 arm64 linux 的好替代品。 nebula 提供了一个最小的位置无关 shellcode 模板,在运行时解析符号。 自包含,几乎可以注入到任何地方。
## 如何实现
## 解析 **模块** 解析 `/proc/self/maps`,从路径中提取名称,使用 djb2 哈希。 如果哈希匹配且基地址包含有效的 elf64 头,则返回基地址。 **符号** 定位 `PT_DYNAMIC`,提取 `DT_SYMTAB`/`DT_STRTAB`/`DT_STRSZ`。 遍历符号表,对每个名称进行哈希,比较。 匹配 --> 返回 `base + st_value`。
## 系统调用 内联汇编。 arm64 linux 约定: `x8` = 编号,`x0-x5` = 参数,`svc #0` ``` static inline i64 sys_write(i32 fd, const void *buf, size_t n) { register i64 x0 asm("x0") = fd; register i64 x1 asm("x1") = (i64) buf; register i64 x2 asm("x2") = n; register i64 x8 asm("x8") = 64; asm volatile("svc #0" : "+r"(x0) : "r"(x1),"r"(x2),"r"(x8) : "memory"); return x0; } ```
## 位置无关 | 标志 | 用途 | |--------------------|-------------------| | `-fPIE` | 位置无关 | | `-mcmodel=tiny` | ±1MB pc 相对 | | `-fno-plt` | 无 PLT 存根 | | `-fno-jump-tables` | 无绝对跳转 | 链接器脚本从 0 开始,节连续。 使用 `__start`/`__end` 标记计算大小。
## 上下文 ``` nebula_ctx_t { self { base, size, crc } proc { pid, comm } libc { base, write, read, mmap, mprotect, munmap, exit } ready } ```
## 项目文件 | 路径 | 描述 | |------------------|----------------------------| | `src/entry.S` | 入口存根 | | `src/nebula.c` | 核心运行时 | | `include/*. h` | 类型、ELF、系统调用、哈希 | | `test/loader.c` | 简单加载器 |
## 构建 ``` make # 如果你想用我的加载器 gcc -o bin/loader test/loader.c -Wall ./bin/loader bin/nebula.bin ```
## 用法 请实现 `nebula_exec()`: ``` void nebula_exec(nebula_ctx_t *ctx) { ctx->libc.write(2, "hi\n", 3); } ```
## 参考 - [Cracked5pider/Stardust](https://github.com/Cracked5pider/Stardust) - [arm64.syscall.sh](https://arm64.syscall.sh) - 我为其他之前的项目编写的代码
标签:aarch64, arm64, crc32, djb2 hash, DT_STRTAB, DT_SYMTAB, ELF64, embedded shellcode, exploit development, -fno-jump-tables, -fno-plt, -fPIE, injectable, inline assembly, linker script, loader, -mcmodel=tiny, memory mapping, nebula_ctx_t, PIC, PIE, position-independent, /proc/self/maps, PT_DYNAMIC, runtime symbol resolution, self-contained, shellcode, __start __end, static inline, svc, SVC, syscall, Tiny Code, x8 register convention, 客户端加密