首页
社区
课程
招聘
[原创]【ARM】安卓SO中GOT REL PLT 作用与关系
发表于: 2017-10-15 23:44 14666

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

2017-10-15 23:44
14666

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

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表重定位类型的内容。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2019-6-12 11:04 被爱吃菠菜编辑 ,原因:
上传的附件:
收藏
免费 6
支持
分享
最新回复 (19)
雪    币: 6729
活跃值: (3902)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2017-10-16 00:17
0
雪    币: 241
活跃值: (226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
干货  感谢分享
2017-10-16 00:34
0
雪    币: 552
活跃值: (4042)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
顶,不错啊
2017-10-16 10:16
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
干货   感谢分享 
2017-10-17 21:38
0
雪    币: 2141
活跃值: (7195)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
6
之前写的太混乱,更新了一下~
2017-10-27 13:14
0
雪    币: 41
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2017-11-14 08:45
0
雪    币: 57
活跃值: (381)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏
2018-7-24 00:10
0
雪    币: 1135
活跃值: (2018)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
9
好文!!!感谢分享
2018-7-24 09:37
0
雪    币: 249
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2018-8-23 11:59
0
雪    币: 2506
活跃值: (4848)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
精髓
2019-12-26 14:45
0
雪    币: 162
活跃值: (170)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
好资料 收藏了
2020-5-13 08:42
0
雪    币: 614
活跃值: (853)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
不错,讲得很明白。
2020-5-13 10:46
0
雪    币: 758
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习资料
2020-5-13 16:52
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享,这属于动态链接的内容吧?
2020-5-14 09:53
0
雪    币: 443
活跃值: (1157)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
感谢分享,我通过R2分析了一波/
2020-12-5 22:38
0
雪    币: 582
活跃值: (317)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
ding feichangbang
2020-12-8 10:28
0
雪    币: 6812
活跃值: (3070)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
好资料 收藏! 谢谢楼主。
2020-12-8 11:41
0
游客
登录 | 注册 方可回帖
返回
//