首页
社区
课程
招聘
[原创]Android系统内核提取及逆向
2021-3-23 21:44 28850

[原创]Android系统内核提取及逆向

2021-3-23 21:44
28850

android系统内核提取及逆向

前言

该部分主要是涉及到Android设备的内核提取与逆向分析相关的知识点,通常是用于对内核对底层文件的分析。原本计划是从提取到逆向分析再到POC编写一条龙服务,能力有限,漏洞分析和POC编写就留到以后再分享。第一次发帖,请多多关照,能力有限,大神们轻点喷。

第一节 boot.img的结构

在介绍boot文件之前,简单阐述一下android系统的分区

 

比较重要的几个分区如下:

 

1、/boot分区:该分区主要包含android kernel镜像和ramdisk(一种将RAM模拟为硬盘的技术,提高访问速度)。

 

2、/system分区:该分区主要存放Android框架及其相关配置,包含系统预装的app。

 

3、/recovery分区:该分区主要是备份的分区

 

4、/data 用户数据的存储区域

1
2
3
/data/app/com.xxxx/ 以包名存放应用安装文件,包括base.apk /lib
/data/data/com.xxxx/ 存放应用数据,包括sp、db等
/data/dalvik-cache 以包名存放优化过的应用dex文件

5、/cache分区:Android系统缓存区域,保存系统最常访问的数据和应用程序。

 

6、/misc分区:此分区包含一些系统功能设置开关和数据,比如USB设置。

 

7、sdcard分区:外置存储分区

 

8、/vendor分区:厂商定制的分区,厂商的某些系统升级可以通过这个分区来实现。

boot文件

boot.img就是android系统的Linux内核主要的镜像文件,在该文件中大致包含boot header,kernel,ramdisk。

 

boot.img文件跳过2K的文件头之后,包含两个gz压缩包,一个是boot.img-kernel.gz Linux内核,一个是boot.img-ramdisk.cpio.gz,然后加上ramdisk文件。

 

大致的结构图如下

 

 

值得注意的是我们的boot.img文件在针对kernel是有不同压缩算法来进行压缩的,在后面的实战环节中是有相关的案例。

第二节 提取内核及分离

提取

提取内核可以从升级包中提取,也可以选择从Android手机中提取内核,android手机中提取内核的方法百度一大堆,这里就不展开。

分离

分离内核通常会使用到binwalk、imgtool、或者其他集成工具,建议分离在Linux环境中进行。

 

使用binwalk查看相关的结构

 

 

一个boot.img文件在前面的章节中介绍过,会大致有三个结构。而我们的内核文件则会使用压缩算法进行压缩,我们需要分离出这三个部分的文件,我们可以使用imgtool或者perl脚本进行分离。

我们先来看perl脚本集合工具

如下图:

 

 

boot_info是用来查看boot.img信息的脚本文件。

 

 

可以查看到镜像文件的大小还有其他的一些基础信息。

 

split_boot 脚本

 

该脚本的功能就是分解boot.img或者recovery.img文件。

 

解压后的文件目录如下:

1
2
3
boot/ramdisk
boot.img-kernel
boot.img-ramdisk.cpio.gz

其中unpack_ramdisk和repack_ramdisk是对ramdisk进行解包和打包的工具脚本。

 

在我们对boot.img文件提取后还需要查看生成的boot.img-kernel文件的内容,大部分提取出来的都会存在压缩算法,gzip、lz4等等压缩,我们再进行解压才能够得到我们用于内核分析。

 

 

可以查看到的使用了lz4压缩算法,那我们可以直接使用lz4工具进行解压。

1
lz4 -d filename

imgtool工具解包

该工具需要自己编译一下

 

工具链接:https://github.com/kerastinell/imgtool

 

编译之后就可以使用工具进行解包

 

解包之后的文件

 

 

与上一个工具的解包后的文件是相似的,我们依然需要查看相应内核文件的压缩算法,依然需要使用解压工具进行解压即可。

解包实例分析

实例1

固件:nexus6p手机中脱的内核镜像

 

在拿到一个img文件我们可以使用file命令去查看一个基础信息

 

 

使用boot_info工具也可以查看更加详细的信息。

 

 

基础信息对我们提取内核并没有多大帮助,如果后期设计到修改内核文件,重新打包boot.img这些信息对我们来讲就是有用。

 

接下来我们可以使用binwalk工具查看一下文件类型

 

 

可以看出boot中含有两个使用gzip压缩的文件,在前面介绍boot.img文件结构的时我们就讲过含有三个压缩包文件。

 

我们可以尝试使用暴力提取的方法,直接使用binwalk提取我们的内核文件。

 

 

会生成四个文件(实际上是三个),我们依次查看文件类型。

 

 

第一个文件就是我们的内核文件,第二个是我们的

 

第二种办法使用比较官方的解法,也是比较正式的解法来剥离我们的内核。

 

该方法会使用到上面提供工具进行解包

 

 

 

解出来的三个文件实际上是很官方的三个文件,在这里验证了我们前面的理论知识。

 

我们识别一下我们的kernel文件。

 

 

这就是一个使用gzip压缩的文件,那我们直接解压我们的文件就可以拿到我们的内核文件。这样的形式直接使用binwalk当然可以暴力拉出kernel文件,但是后面的例子就不一定可以暴力拉出kernel文件。

 

 

解压后可以拿到同样的文件。

实例2

固件:pixel-kernel

 

第二个固件我们查看信息会发现采用了LZ4压缩

 

 

这个时候你binwalk暴力提取并不会有什么好的发现,没有办法分离干净。

 

 

得到的两个文件,第一个并不是kernel包含的地方,第二个文件中使用binwalk查看是有内核信息,我们继续使用binwalk暴力提取,会发现生成如下文件

 

 

然后你再去binwalk,一样的结果。

 

这样我们提取内核文件就没办法使用暴力破解的方式。

 

我们来看官方一点的提取方法,除了上面使用的imgtool外,还可以依然使用实例1中的方法。

 

 

可以看出有LZ4压缩算法管理者我们的内核文件,我们只能先解LZ4算法再进行提取。

 

那我们就使用lz4工具解压

 

 

解压之后的问价那我们查看就成功提取到我们的kernel文件啦。

 

实例3

固件:某嵌入式设备内核

 

 

查看基础文件类型,我们可以看到另外一个新的压缩算法LZO

 

同样我们可以使用binwalk暴力破解。

 

 

这个76C5文件就是我们想要的文件。

 

当时使用比较正式的方法也是可以进行提取的,这里就不过多讲解。

第三节 逆向分析

在逆向分析过程中,我们加载上面分离出来的内核文件。

 

工具使用:

 

IDA pro 7.5

 

droiding(https://github.com/nforest/droidimg

 

通常的做法是使用IDA加载二进制文件,根据我们系统架构来选择相应的分析

 

 

选择处理器类型,然后在设置内核起始地址为0xC0008000(0xFFFFFFC0008000)

 

 

这样就将二进制文件加载到IDA中,但是我们的IDA并不会自动给我们进行反编译分析,需要我们手动进行转换成代码文件,或者我们也可以使用脚本进行。

 

同时,这样加载的二进制内核文件并没有符号表,我们还需要去提取符号表。

 

我们现在已经root过的手机中查询我们的符号表。

1
cat /proc/kallsyms >> kernel_synbols.txt

然后使用python脚本导入IDA中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import idaapi
import idautils
import idc
 
def do_rename(l):
    splitted = l.split()
    straddr = splitted[0]
    strname = splitted[2].replace("\r", "").replace("\n", "")
 
    eaaddr = int(straddr, 16)
    idc.MakeCode(eaaddr)
    idc.MakeFunction(eaaddr)
    idc.MakeNameEx(int(straddr, 16), strname, idc.SN_NOWARN)
 
if __name__ == "__main__":
    Message("Hello IDC")
    f = open( "D:\\TOP1_201601\\android\\exploits\\kernel_symbols.txt", "r")
    for l in f:
        do_rename(l)
    f.close()

就可以完成我们的加载,但是这样的分析方式比较的复杂,我们在载入二进制内核文件是会出现IDA不分析的提示,需要我们手动去选择分析点。

 

使用IDA插件droiding

 

该插件的功能可以自动的解析我们的内核文件,并对符号进行重命名,使用的效果非常不错,根据官方文档我们将vmlinux.py文件放在IDAxxx\loaders\文件下就可以在加载二进制内核是多一个选项。

 

 

这样就只需要等待加载完毕就可以直接进行内核分析。

 

 

我们的内核文件就已经被完全反编译出来了,可以进行漏洞分析的逆向分析。

第四节 实战内核提权

实战环节我们就使用相关的未打补丁的内核文件进行实战分析并简单的验证我们的漏洞。

案例1

固件:某嵌入式设备内核

 

Linux-kernel版本:3.0.35-g4113e5c-dirty

 

在我们使用上面的技术手段拿到我们的kernel文件,直接载入含有vmlinux查看的IDA中进行逆向分析。

 

我是在线去搜寻一下该版本的内核存在哪些历史CVE

 

https://www.cvedetails.com/vulnerability-list/vendor_id-33/product_id-47/version_id-135854/opov-1/Linux-Linux-Kernel-3.0.35.html

 


每一个已经修复的CVE都存在补丁,我们检测漏洞的存在与否首先是去确认kernel文件是否打补丁,然后构造poc去验证漏洞的存在性,如果我们是做漏洞安全研究的,还会去梳理漏洞触发的原理,检查补丁是否准确有效,是否可以绕过补丁达到发掘新漏洞的目的。

 

我们以CVE-2014-3153为例来进行分析

补丁分析

首先该漏洞年代比较久远,算是比较经典的漏洞类型,原理我们在后面进行剖析,现在我们先确认我们的版本中是否存在该漏洞。

 

从打补丁的位置进行分析

 

 

总共有三个地方进行了修改,我们在IDA中去分析这三个函数。

 

我们在我们待分析的固件中查看到并没有对该地方进行修复。

 

 

在我们修复的kernel文件中是这样存在的

 

 

除此之外,我们查看一下第二个补丁点,进一步确认漏洞的修复性

 

而我们的第二个补丁位置如下:

 

未打补丁:

 

 

而我们来看看打过补丁的位置

 

 

经过一步一步的去逆向补丁位置,我们可以初步认定该kernel是未打补丁。

 

接下来就是构造该漏洞的POC进行漏洞验证。

 

原则上,想要写出POC是要在理清楚漏洞触发的原理才能够poc的编写。当然,我们同样可以使用公开的poc来进行漏洞的验证。

POC构造

http://blog.topsec.com.cn/cve2014-3153/

 

参考:
https://bbs.pediy.com/thread-209387.htm

 

https://www.cnblogs.com/kevingrace/p/10271581.html

 

https://juejin.cn/post/6844903993924141069

 

https://www.cnblogs.com/0xJDchen/p/6007938.html


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞13
打赏
分享
最新回复 (18)
雪    币: 395
活跃值: (2029)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 2021-3-25 23:47
2
0
提取后,确实能做很多事情了,比如读写驱动。最后支持楼主分享教程
雪    币: 279
活跃值: (3054)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
囧囧 2021-3-26 08:35
3
0
感谢分享
雪    币: 2633
活跃值: (5155)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
YenKoc 2 2021-3-26 10:16
4
0
666
雪    币: 1507
活跃值: (853)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guangzisam 2021-3-26 11:01
5
0
内核不是有源代码吗:还需要逆向?手机厂商会改内核?
雪    币: 335
活跃值: (1257)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
These-us 2021-3-26 16:52
6
0
guangzisam 内核不是有源代码吗:还需要逆向?手机厂商会改内核?
这个主要是针对打过补丁的,还有不一定是在手机中,车联网中也存在android内核,目的是分析内核漏洞
雪    币: 395
活跃值: (2029)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 2021-3-27 13:55
7
0
guangzisam 内核不是有源代码吗:还需要逆向?手机厂商会改内核?
还真会,很多手机厂商开源的第一份内核源码,跟它最新正在商用的ROM里的内核差距已经非常非常大。比如小米。
雪    币: 395
活跃值: (2029)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
abcz316 2021-3-27 13:56
8
0
我研究过上百款手机内核,三星的内核改动挺大的,可以说面目全非了
雪    币: 50
活跃值: (464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-9-14 21:16
9
0
唉 用imgtool解包了boot.img  修改了ramdisk 里default.prop 开启了全局可调试的开关 重打包刷进去能开机却没效果 修改brand也是没有 看日志的确是刷入的修改后的boot.img 有大佬知道为啥吗
雪    币: 335
活跃值: (1257)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
These-us 2021-9-15 09:45
10
0
万里星河 唉 用imgtool解包了boot.img 修改了ramdisk 里default.prop 开启了全局可调试的开关 重打包刷进去能开机却没效果 修改brand也是没有 看日志的确是刷入的修改后的b ...
你是想打开全局调试开关吗?有尝试过magisk这样的比较方便的打开方式吗?或者是你需求是特定的rom,如果不是刚需,可以采用magisk或者编译Android源码的rom
雪    币: 8713
活跃值: (8610)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
r0Cat 7 2021-9-15 10:30
11
0
楼主可以试试这个
https://github.com/anestisb/android-unpackbootimg
雪    币: 50
活跃值: (464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-9-16 20:21
12
0
These-us 你是想打开全局调试开关吗?有尝试过magisk这样的比较方便的打开方式吗?或者是你需求是特定的rom,如果不是刚需,可以采用magisk或者编译Android源码的rom
不是 我主要是想知道修改了为啥会没效果 难道boot.img里的ramdisk修改都会无效吗 不知道大佬有没有过修改ramdisk重打包成boot,img进行修改的经验
雪    币: 50
活跃值: (464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-10-24 00:17
13
0
然而并没有什么卵用
使用imgtool提取出了内核 对kernel解压后得到kernel_image
安装droiding 拖入ida 选择android/linux kernel image选项进行反编译 结果报错
[+]kallsyms_arch = arm64
[!]could be offset table...
[!]lookup_address_table error...
[!]get kallsyms error...
手动提取吧 root了的手机没有/proc/kallsyms这个文件
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_zvhkyeie 2021-11-23 14:04
14
0
小米内核编译不过有大佬能指导下吗?付费也可以QQ760986433
雪    币: 1998
活跃值: (545)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_lzdkguat 2021-11-25 17:35
15
0
这个教程十分不错,关键是可以打补丁,啊哈哈
雪    币: 1998
活跃值: (545)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_lzdkguat 2021-11-26 12:33
16
0
  [!]not equal, maybe error...
[!]get kallsyms error...
Unloading IDP module D:\Program Files (x86)\IDAPro\procs\arm64.dll...
雪    币: 50
活跃值: (464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-12-8 06:22
17
0
手机里面没有/proc/kallsyms文件怎么办呀 有root
雪    币: 379
活跃值: (394)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsljk 2021-12-8 22:14
18
0
6呀6呀
雪    币: 1998
活跃值: (545)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_lzdkguat 2021-12-9 17:32
19
0
droiding放进去之后打开内核二进制文件会闪退,不知道怎么回事
游客
登录 | 注册 方可回帖
返回