如何在 Linux 中成功地将代码段添加到可执行文件中?

逆向工程 二元分析 linux 小精灵 可执行 二进制格式
2021-07-07 21:43:48

我在 Linux 中,我已经多次看到这个问题,但从来没有,没有人回答如何真正使这项工作发挥作用。

我需要向已经编译的二进制文件添加一个部分。让我们说一下是一个ELF文件。我正在使用objcopy,所以这对于任何格式都应该是通用的,因为objcopy使用处理多种格式的libbfd

我的流程如下。

我为要附加到已编译 ELF 文件的部分创建字节码。让我们将此文件命名为 bytecode.bin

然后我做:

objcopy --add-section .mysection=bytecode.bin \
--set-section-flags .mysection=code,contents,alloc,load,readonly \
myprogram myprogram_edited

然后我调整了该部分的VMA:

objcopy --adjust-section-vma .mysection=$((16#XXXXX)) myprogram_edited myprogram_edited

其中 XXXXXX 是该部分的新 VMA 地址。

我收到警告:

objcopy: stIbZt3t: warning: allocated section `.mysection' not in segment

当我做:

objdump -d myprogram_edited

我明白:

Disassembly of section .mysection:

0000000000201011 <.mysection>:
...
...

所以我看到该部分创建正常并且 VMA 已调整。但是该部分未映射到段,因此无法在运行时加载。

我该如何解决这个问题?

编辑:

我选择使用英特尔的PIN工具。对于 RI 和二进制注入非常有用和强大。

3个回答

libbfd不是魔术棒,它实际上非常有限(这是 GDB 在没有节表的情况下无法调试文件的原因之一)。特别是,objcopy不会为您添加 PHT 条目,因此您必须手动扩展或调整 PHT。您可以使用十六进制编辑器手动执行此操作,也可以尝试使用诸如libelf(它为您提供必要的原语,但您需要自己实现逻辑)之类的库。

也许你可以看看LIEF:

GitHub 页面:https : //github.com/lief-project/LIEF

网站:https : //lief.quarkslab.com

我最终使用了英特尔 PIN

挺好用的