【发布时间】:2015-04-26 19:31:50
【问题描述】:
我正在尝试修改我自己的 ELF 文件的可执行内容,看看是否可行。我编写了一个程序,它读取和解析 ELF 文件,搜索它应该更新的代码,对其进行更改,然后在更新节标题中的 sh_size 字段后将其写回。
但是,这不起作用。如果我只是用其他字节交换一些字节,它就可以工作。但是,如果我更改大小,它会失败。我知道一些 sh_offsets 是直接相邻的;但是,当我减小可执行代码的大小时,这并不重要。
当然,我的程序中可能存在错误(或多个),但我已经煞费苦心地解决了。
除了寻求帮助来调试我的程序之外,我只是想知道,除了 sh_size 字段之外,我还需要更新以使其工作(减小大小时)吗?除了那个字段,还有什么会导致更改长度失败的吗?
编辑:
看来安迪·罗斯是完全正确的。即使在这个非常简单的程序中,我也遇到了 __libc_start_main 中的一些间接寻址,我无法通过简单的修改来更新它将达到的偏移量。
不过,我很好奇,要尽可能解决这个问题,最好的方法是什么?我知道我不能在每种情况下都解决这个问题,但是对于一些简单的程序,应该可以更新使其运行所需的内容?我应该尝试编写自己的虚拟机还是尝试开发一个“调试器”,用 INT 3 替换每个可疑的问题指令?有什么想法吗?
【问题讨论】:
-
它是什么ELF文件?你是怎么制作的?它是动态链接的还是静态链接的可执行文件,还是某个共享对象?见stackoverflow.com/a/12551737/841108
-
ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),未剥离