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的方法最为靠谱。
相关文章推荐
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 关于360笔试题的一个题目的以下代码执行后输出结果为()思考
- arcgis server 9.2代码阅读笔记一:在图层中增加一个点
- 一个非常简单的Oracle存储过程,及其在C#.net中的执行的代码
- 一个问题,两人讨论,几行代码,一些启发
- 给editPlus增加一个PHP的代码分析器ZDE
- 一个问题,两人讨论,几行代码,一些启发
- 网站防止注入入侵的一些有效代码和方法
- 一个问题,两人讨论,几行代码,一些启发
- 一个注入winlogon的程序的代码,学习API用
- 最近项目中一些关于代码编写管理的一些思考
- 经过测试的 可以使用的远程注入代码!!!!!我的VC里面缺少一个stdafx.h需要拷贝一个到程序
- 一段旧代码,引起的关于OO中一个问题的思考
- 一个简单的动态编译器,支持C#和VB.NET。当你想测试一些简单的代码的时候可以使用。
- 一个问题,两人讨论,几行代码,一些启发
- 如何向其他线程的地址空间中注入代码并在这个线程的上下文中执行之
- 如何向其他线程的地址空间中注入代码并在这个线程的上下文中执行之
- 在IE关闭时,转到一个页面中,执行一些操作,然后关闭IE.
- 一个问题,两人讨论,几行代码,一些启发