我在Linux上,我已经看过几次这个问题了,但是从来没有,没有人回答过如何真正实现这项工作。可以说是一个ELF文件。我正在使用objcopy,因此这对于任何格式都是通用的,因为objcopy使用可处理多种格式的libbfd。

我的过程如下。我想附加到已经编译的ELF文件中的部分。让我们将此文件命名为bytecode.bin

然后我做: br />
objcopy --add-section .mysection=bytecode.bin \
--set-section-flags .mysection=code,contents,alloc,load,readonly \
myprogram myprogram_edited


其中XXXXXX是该节的新VMA地址。

我得到警告:

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


执行操作时:

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


我看到:

objdump -d myprogram_edited


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

如何解决此问题?

EDIT:

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

#1 楼

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

评论


“这是GDB无法在没有节表的情况下调试文件的原因之一” –这就是我一直想知道的事情。感谢您提及此

– julian♦
17年1月1日在9:57

问题是,我需要一些通用工具来处理更多可执行文件格式,而不仅仅是ELF。但是我认为仅ELF已经是一个不错的问题。

– 0xfede7c8
17年1月1日在18:44

好吧,我不知道有任何这样的工具,因此我想您必须自己编写。

–伊戈尔·斯科钦斯基♦
17年1月1日19:31

#2 楼

也许您可以看看LIEF:

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

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

评论


如果您可以提供有关如何编写LIEF中所要求内容的基本示例,那么您的答案将更有价值。

–恐怖
17年4月5日在10:31

#3 楼

我最终使用了英特尔PIN码

非常有用。

评论


好吧,PIN不会“在已编译的二进制文件中添加一个部分”,因此这并非如前所述。

–伊戈尔·斯科钦斯基♦
19年8月12日在18:54