-
-
[讨论]修改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
请高手指点迷津,或者大家有什么问题也可以一起探讨学习~
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
请高手指点迷津,或者大家有什么问题也可以一起探讨学习~
赞赏
他的文章
看原图
赞赏
雪币:
留言: