静态修改 ELF 可执行文件的可用库有哪些?

逆向工程 工具 混淆 去混淆 小精灵
2021-06-29 04:19:46

我希望能够直接从可执行格式(而不是在编译时)重写或重组 ELF 二进制程序。

我所知道的唯一能做到这一点的库是elfPriority(在Miasm 中使用)。但是,一定还有其他人。那么,用于静态修改 ELF 可执行文件的库或框架是什么?

3个回答

我只是偶然发现了这个项目ERESI该项目本身看起来非常雄心勃勃,主要支持 Intel 和 Sparc 处理器,同时也支持其他一些处理器。还有很多工具可能会派上用场。它确实有一个特定的工具,听起来好像完全符合要求,还有很多其他相关的工具:

Evarista:一个完全用 ERESI 语言实现的开发中的静态二进制程序转换器。

Patchelf 可能会在修改 elf 中指定的链接器或 rpath 时派上用场:

PatchELF是一个小实用程序,用于修改 ELF 可执行文件的动态链接器和 RPATH

还有一个关于injectso的演示,它似乎与精灵二进制文件的静态和动态补丁主题有关。诚然,静态二进制文件的覆盖范围是有限的,但这是可以预料的,因为它比仅仅作为一个库插入器更复杂。

如果您正在寻找专门的库,那么 ERESI 项目确实使用了很多库,因此您可能可以将 Evarista 作为指南,并使用这些库编写更符合您目标的内容。

libelfsh:ELFsh、Kernsh、E2dbg 和 Etrace 使用的二进制操作库。

libe2dbg:在debuggee程序中运行的嵌入式调试器库。

libasm:智能反汇编引擎(x86、sparc、mips、arm),为指令及其操作数提供句法和语义属性。

libmjollnir:控制流分析和指纹库。

librevm:运行时 ERESI 虚拟机,包含框架的中央运行时环境实现。

libstderesi:包含超过 100 个内置分析命令的标准 ERESI 库。

libaspect:方面库带来其 API 以反映 ERESI 语言中的代码和数据结构。

libedfmt : ERESI 调试格式库,可以将 dwarf 和 stabs 调试格式转换为 ERESI 调试格式。

libetrace : ERESI 跟踪器库,Etrace 基于它。

libkernsh:内核 shell 库是 Kernsh 所基于的内核可访问性库。

libgdbwrap:GDB 串行协议库,用于 ERESI 和 GDB/VMware/Bochs/Qemu/OpenOCD 之间的兼容性。

我认为你最好的选择是采用低级 ELF 库并编写一个小程序来做你想做的事。我喜欢ELF 工具链项目我发现团队整合的测试和文档非常好。不管你最终使用什么工具,你肯定想阅读关于为 Linux 创建真正青少年 ELF 可执行文件的旋风教程,其中讨论了如何将 ELF 可执行文件修改为尽可能小(你的目的可能不同,但有很多的一般课程)。

e9补丁

E9Patch 与其他工具的不同之处在于它可以静态重写 x86_64 Linux ELF 二进制文件,而无需修改跳转目标集。为此,E9Patch 使用了一组新颖的低级二进制重写技术,例如指令双关、填充和驱逐,它们可以插入或替换二进制代码,而无需移动现有指令。由于不移动现有指令,因此跳转目标集保持不变,这意味着不需要更正调用/跳转(包括交叉二进制调用/跳转)。

e9patch技术

论文:没有控制流恢复的二进制重写

基于e9patch的项目:

  • e9afl - 将 AFL 的仪器插入到 ELF 二进制文件中。我已经成功地使用它在生产环境中对闭源二进制文件进行模糊测试;然而,使用带有 QEMU 的 AFL++ 优于这种方法。
  • e9syscall - 使用libc.so 的静态二进制重写的系统调用拦截。