linux之如何以更改文件部分数据长度的方式修改 ELF 文件

JustinYoung 阅读:18 2024-02-27 23:08:18 评论:0

我正在尝试修改我自己的 ELF 文件的可执行内容,看看这是否可行。我编写了一个程序来读取和解析 ELF 文件,搜索它应该更新的代码,更改它,然后在更新节头中的 sh_size 字段后将其写回。

但是,这不起作用。如果我只是将一些字节与其他字节交换,它就可以工作。但是,如果我更改大小,它将失败。我知道一些 sh_offsets 彼此紧邻;但是,当我减少可执行代码的大小时,这应该无关紧要。

当然,我的程序中可能存在一个错误(或不止一个),但我已经煞费苦心地解决了它。

我没有寻求帮助调试我的程序,我只是想知道,除了 sh_size 字段之外还有什么我需要更新才能使这项工作(当减小大小时)吗?除了该字段之外,还有什么会使更改长度失败的吗?

编辑:

看来安迪罗斯是完全正确的。即使在这个非常简单的程序中,我也遇到了 __libc_start_main 中的一些间接寻址,我无法简单地修改以更新它将达到的偏移量。

不过,我很好奇,仍然试图尽可能解决这个问题的最佳方法是什么?我知道我无法在所有情况下都解决这个问题,但是对于一些简单的程序,应该可以更新使其运行所需的内容?我应该尝试编写自己的虚拟机还是尝试开发一个“调试器”,用 INT 3 替换每个可疑的问题指令?有任何想法吗?

请您参考如下方法:

文本段可能在内部与相对偏移量相关联。因此,一个函数可能会尝试跳转到“当前地址加上 194 个字节”。如果你移动一些东西,使得跳转目标现在是 190 字节,你显然会破坏一些东西。某些架构(例如 x86-64 但不是 i686)上的常量数据也是如此。要知道内部引用在哪里,没有简单的方法可以知道内部引用在哪里,事实上,找到它们在计算上是不可判定的(即试图找出运行时计算分支的所有可能的跳转目标是停机问题)。

基本上,这在一般情况下是无法解决的,因此如果您尝试修补其他人的 ELF 二进制文件,则需要尝试其他技术。但是(太棒了!)小心,可以生成一个库,其中所有内部引用都通过 GOT/PLT,可以像这样切片和重新链接。你想达到什么目的?


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号