首页
论坛
课程
招聘
[原创]【ARM】安卓SO中GOT REL PLT 作用与关系
2017-10-15 23:44 8821

[原创]【ARM】安卓SO中GOT REL PLT 作用与关系

2017-10-15 23:44
8821

之前写的太混乱,修改了一下~

1 got rel plt的由来

clock()和optopt这两个符号不在本模块内。
由于这种依赖的外部SO库可能存在进程内存的任何地址,
所以程序编译完成后,程序并不知道这些函数和变量的内存地址的。
只有程序跑起来时,找到了依赖的SO模块加载地址,通过一系列结构的配合,
才能确定它们的地址以访问执行。

 


·
·

·
·
BTW:
(1)程序从磁盘文件复制到进程内存中,叫装载
(2)在进程内存中,找到上面说的那些函数/变量地址,叫重定位.(可能在本模块 也可能在外部SO模块)
(3)装载 + 重定位的整个过程,叫链接。
(4)负责完成这件事的,叫链接器。
·
·
·
·

2 那么本程序是如何找到这些外部变量\函数的地址的?

通过rel表 gpt表 和plt表的配合。

·
·
·
·

3 怎么配合的?

(1)rel表的作用是:

本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
·
·

(2)got表的作用是:

用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
·
·

(3)当程序执行到引用变量或调用函数时:

就去访问got表项找这个地址。
就去访问got表项找这个地址。
就去访问got表项找这个地址。
·
·

(4)啰嗦的解释下:

ELF中每一个这样不确定地址的地方,都会生成一个rel表项。
每个rel表项,都对应一个需要修正地址的地方。
·
每个rel表项,都对应指出一个got表项地址。
·
每个got表项用来存放找到的地址。
·
链接器将本模块装载进入进程内存时,
会遍历本模块的rel表项,得知谁需要修正,将修正的地址填入对应got项。
·
做这件事的时机是,链接器将本模块装载进入内存时,本模块init段代码运行前。
(android arm elf情况下,这种叫装载时重定位)
·
·

(4)总结来说就是:

REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
·
·
·
·

4 观察实例 验证上面说

readelf -r xxx.so

IDA下的rel表

IDA下的got表

·
·
·
·

5 观察总结

(1)给模块外libc.so库的函数clock() 、变量optopt生成了相应的rel目

·

(2)没有给模块内的myFun()生成rel项

(因为它在本模块内,不需要链接器和rel got那套玩意,自己就能直接确定地址,这种方式叫相对寻址)
(但是也可用把这件事交给链接器做,也就是给它也生成相应的rel项和got项)
·

(3)给myVar生成了rel项和got项

·

(4)关于rel.dyn , rel.plt , R_ARM_JUMP_SLOT , R_ARM_GLOB_DAT这些东西先不说,以后再解释。

·
·
·
·

6 观察反汇编和运行时clock()等的访问,

验证上面说的rel got plt 的配合过程。

objdump -d --start-address=0xF94 --stop-address=0xFEC xxx.so
objdump -d --start-address=0xE10 --stop-address=0xE1C xxx.so

·
·
·
·

7 观察总结

图里都写清楚了,不熟悉同学多调试几次观察。这里就补充解释下plt部分。
·
·
偏移fbc处的ebffff93 bl e10 clock@plt,

实际上并没有跳转到外部的libc.so的clock()函数,

而是跳转到了自身的plt节中,接着看下plt出指令的内容。

·
·
objdump和ida的反汇编结果看起来并不相同,但实际是相同的,因为IDA显示的是伪指令。

 

objdump是这样反汇编的:

·
·
IDA是这样反汇编的:

·
·

plt这段指令什么意思呢?

其实就是读取clock()对应的got表项值,然后将值赋给PC跳转到clock()。
bl clock() →→→ plt →→→ got →→→ libc.so clock()
·
·

所以这里的plt的作用是:

读取函数其对应的got项的值,然后赋给PC。
·
·
·
·
·
·
·
至此,安卓ELF的GOT REL PLT 作用与关系就介绍完了。
有时间的话,下一篇打算叨叨下REL表重定位类型的内容。


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

最后于 2019-6-12 11:04 被爱吃菠菜编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (16)
雪    币: 2760
活跃值: 活跃值 (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MaYil 活跃值 2017-10-16 00:17
2
0
感谢分享
雪    币: 236
活跃值: 活跃值 (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
ckis 活跃值 2017-10-16 00:34
3
0
干货  感谢分享
雪    币: 30
活跃值: 活跃值 (267)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
龙飞雪 活跃值 2017-10-16 10:16
4
0
顶,不错啊
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
奔跑吧狒狒 活跃值 2017-10-17 21:38
5
0
干货   感谢分享 
雪    币: 823
活跃值: 活跃值 (597)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
爱吃菠菜 活跃值 1 2017-10-27 13:14
6
0
之前写的太混乱,更新了一下~
雪    币: 55
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
金奔腾 活跃值 2017-11-14 08:45
7
0
感谢分享
雪    币: 285
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huuio 活跃值 2018-7-24 00:10
8
0
收藏
雪    币: 276
活跃值: 活跃值 (173)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
茅山小僧 活跃值 2018-7-24 09:37
9
0
好文!!!感谢分享
雪    币: 259
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无所从来 活跃值 2018-8-23 11:59
10
0
mark
雪    币: 822
活跃值: 活跃值 (217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
KerryS 活跃值 2019-12-26 14:45
11
0
精髓
雪    币: 162
活跃值: 活跃值 (58)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
禾之舟 活跃值 2020-5-13 08:42
12
0
好资料 收藏了
雪    币: 419
活跃值: 活跃值 (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eastmaster 活跃值 2020-5-13 10:46
13
0
不错,讲得很明白。
雪    币: 758
活跃值: 活跃值 (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
壹久玖 活跃值 2020-5-13 16:52
14
0
学习资料
雪    币: 21
活跃值: 活跃值 (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sodarkbit 活跃值 2020-5-14 09:53
15
0
感谢分享,这属于动态链接的内容吧?
游客
登录 | 注册 方可回帖
返回