首页
社区
课程
招聘
[讨论]修改ELF的问题,请教各位~(有工具有例子)
发表于: 2013-6-3 09:51 3905

[讨论]修改ELF的问题,请教各位~(有工具有例子)

2013-6-3 09:51
3905
先说一下我的理解,不对的地方请各位指出!

ELF格式是这么规定的:
1. 0x00 ~ 0x33 是 file header
2. section headers 和 segment headers 必须是连续存放的

然后对其他的位置没有硬性规定,通过 offset 来指定就可以了

那么我想做个实验,移动某一个 section entry,然后修改相关的 offset,理论上应该是可行的
那么就用 .dynsym 这个 section 来实验
另外说明一点就是目前只针对32位的ELF

实验步骤:
1. ModifyElf.exe
   我写了一个工具 ModifyElf.exe,这个工具的作用是移动某个 section entry,用法如下
   ModifyElf.exe <srcfile> <dstfile> <sectionname> <mov2fileend:0|1>    <clearold:0|1>
   对5个参数解释如下:
   <srcfile>         ->  原始so文件路径
   <dstfile>         ->  目标so文件路径
   <sectionname>     ->  section 的名字,当前只支持.dynsym
   <mov2fileend:0|1> ->  mov2fileend:0 表示将 section entry 移动到 so文件的未使用的空白区域,文件大小不变
                         mov2fileend:1 表示将 section entry 移动到 so文件的尾部,这会增加文件大小
   <clearold:0|1>    ->  clearold:0 表示不清除原来的 section entry
                         clearold:1 表示将原来的 section entry 全部置为 0xFF,目的是——如果清除后程序仍运行正常,那么就可以确认新的 section entry 是生效的了

   调用示例:
   ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:0 clearold:1

2. libfoo.so 与 linux_hello
   linux_hello 是 linux 下的可执行程序,作用是通过 dlopen 调用 libfoo.so 里面的 myfn 函数,而 myfn 会打印一个字符串
   
   neil0@vm32:~/share/test$ sudo chmod a+x linux_hello
   neil0@vm32:~/share/test$ export LD_LIBRARY_PATH=~/share/test:$LD_LIBRARY_PATH
   neil0@vm32:~/share/test$ ./linux_hello
   dlopen ok!
   call myfn...!
   
3. 关键步骤
   通过 ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:0 clearold:1
   得到一个新的 so文件, 用这个 so到 linux 下替换原来的,linux_hello 执行正常!可以用文件比较工具看看两个so的区别
   
   然后 ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:1 clearold:1
   这次是移动到文件尾部,再次替换,执行 linux_hello 出错,显示 Segmentation fault

请高手指点迷津,或者大家有什么问题也可以一起探讨学习~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//