您的位置:首页 > 编程语言

elf增加一个可执行段以注入代码的一些思考

2017-05-22 16:31 281 查看

注入代码需要什么

向elf中注入代码为patch带来了极高的灵活性,使得对函数进行hook从而达到更改参数,在线更改值以及监视函数执行等一系列

行为提供了可能。可是向segment中注入代码并不如想象的那么简单,有一些东西需要注意才能够真正达到效果。

elf可执行文件执行的关键其实是segment,在执行的过程中section相对并不重要,即使section有一些损坏,只要segment,包括

program header和program header中包含的数据完整,是可以正常执行的,不过可能为gdb等调试带来一些麻烦。

注入代码,其实就是注入segment。

关于注入代码的思考

我自己对于注入代码进行了一些简易的思考,大致可以有以下几种方法:

1. 扩展已有的segment,使得自己的数据能够被放进去

2. 修改用处不大的segment,使其为我所用

3. 增添segment

最终,我选择了使用最后一种方法,并且试图对他进行实现。对于小范围的工具,比如ctf线下攻防赛所需要的patcher来讲,前

两种还具有一定的用处,但是毕竟都有很大的缺陷,一旦任务变得繁重,很可能导致一些不稳定的事情发生。增添一个segment可以

自由的控制segment的大小,并且具有扩展性,如果增添的数据量过大也依然可以正常使用,毕竟增添segment不止可以增添一个,

也可以增添多个。

增加segment的注意事项

经过一天的调试,我发现增加segment也并不是那么简单的事情,有很多地方需要注意到才能够正常执行程序。

1. 增加segment之后,如果想要保持section的正常,那么需要修正section table 里的entry的offset,否则会导致错位。另外,

更重要的是,需要修正program header table里的entry的offset,否则就根本无法正常执行。

2. 除了修正segment,还需要注意几个特殊的program header。第一个program header往往是向内存中映射program header table

自身,所以如果增加了program header的entry,这里需要进行修正。另外,往往有一个是一个主要的内存映射关系,有一个主要

的loadable segment,这里也需要进行修正才可以正常执行。

目前,我能够做到的是,在复制一份新的segment header之后能够通过修正使得程序正常执行,方法就是基于以上两点。

不过我的想法是能够真正做到原生的去更改,能够直接插入segment header并且通过修正section使得一切都非常正常。

(更新)

最后发现不太可能,因为elf的入口一般是0x400400,然后一个重要的映射是将从文件头开始一直映射过去,其中包含了program

header和0x400400这个入口,以及代码段等等,由于program header是完整的被直接映射过去,如果插入了新的program header,

必然导致后面入口等等的代码错位,而由于是直接整个映射到内存中的,想要修复只能够更改入口以及各符号的位置,况且还不

排除有其他因素会导致错位之后存在问题。

最终决定,还是复制一份新的segment header,在整个文件最后进行添加segment header的方法最为靠谱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐