首页
社区
课程
招聘
[求助]请问为什么安卓ELF格式的so动态链接库的段(segment)可以重合?
发表于: 2017-6-10 04:46 3723

[求助]请问为什么安卓ELF格式的so动态链接库的段(segment)可以重合?

2017-6-10 04:46
3723

最近在研究安卓的ELF动态链接库,网上看了一些资料,当我在用readelf查看某个样本安卓elf时,在Program Header里面发现了以下信息:

Program Headers:
  Type                    Offset       VirtAddr        PhysAddr      FileSiz     MemSiz  Flg Align
  PHDR                  0x000034 0x00000034 0x00000034 0x000e0 0x000e0 R   0x4
  LOAD                  0x000000 0x00000000 0x00000000 0x02138 0x02138 R E 0x1000
  LOAD                  0x002eb8 0x00003eb8 0x00003eb8 0x0014c 0x0014c RW  0x1000
  DYNAMIC           0x002ec4 0x00003ec4 0x00003ec4 0x000f8 0x000f8 RW  0x4
  GNU_STACK    0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX                 0x002078 0x00002078 0x00002078 0x000c0 0x000c0 R   0x4
  GNU_RELRO    0x002eb8 0x00003eb8 0x00003eb8 0x00148 0x00148 RW  0x4

问题是,不同于windows的PE,在windows下所有区段都要以0x200对齐(ELF貌似没有这个限制?),而且区段不可能重合。

但在这里,明显第一个区段(PHDR)那个0x34-0x114就被包括在了第二个区段(LOAD)0x0-0x2138,而且Flg还自相矛盾:PHDR那个不可执行但是LOAD那个可以。。。

0x2eb8-0x3004的区段3(也是LOAD)也和DYNAMIC、GNU_RELRO重叠了。。。


这种重叠的区段在ELF中是允许的吗?那运行时在内存镜像中矛盾的Flg会被怎么处理呢?

查了好久也没找到相关说明。。。折腾我一天了。。实在没办法才来发帖问的。。有大神了解这方面的知识吗,或者哪里有相关资料吗?

感激不尽



[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
2017-6-10 08:37
0
雪    币: 241
活跃值: (226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
样本发上来看看
2017-6-10 10:49
0
雪    币: 2030
活跃值: (1303)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
linker只会加载load段,其它段如果需要被加载到内存中,就必须位于load段中。你可以这样理解,load段的信息是告诉linker,elf文件中的哪些内容需要映射到内存,而其它段的信息是方便linker去获取动态链接相关信息的。比如linker通过解析程序头表,获取到这里面的dynamic段的信息,定位到dynamic段,从中解析出各种诸如重定位表、字符串表等的位置信息等等。至于其它段的那些flg,我觉得忽略就好,没什么用处,不必深究。细节可以看linker源码。
2017-6-10 12:06
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
5
ckis 样本发上来看看

so


上传的附件:
2017-6-10 17:21
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
6
十八垧 linker只会加载load段,其它段如果需要被加载到内存中,就必须位于load段中。你可以这样理解,load段的信息是告诉linker,elf文件中的哪些内容需要映射到内存,而其它段的信息是方便li ...
好的谢谢,我再研究下
2017-6-10 17:22
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
7
yezhulove 应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
谢谢
2017-6-10 17:23
0
雪    币: 552
活跃值: (4042)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
yezhulove 应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
“区段是可以重叠(后面覆盖前面)”  谢谢,突然明白了什么。。。
2017-9-11 15:04
0
游客
登录 | 注册 方可回帖
返回
//