《Android安全攻防权威指南》读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/koozxcv/article/details/50537797

好书推荐:

《Android安全攻防权威指南》

1 前言

当阅读一本好书,意会作者思路比学习一个知识点更具价值。因此多总结作者套路,悟其思想。

以上一点小体会。其实总体来说,Android平台的漏洞攻防与Linux上并无二致,不过书中作者提到的几个观点仍很有价值,所以做一备忘。

2 漏洞利用Tips

一个难点是Intel指令集到ARM指令集的变化

1.要理解内存破坏漏洞的利用技术,最关键的是抽象。作为攻击者,应将目标机器的内存看作有限数量的内存单元,由目标程序的语义进行操作。

2.栈的本质只是不同函数之间的ABI约定。

3.与栈相关的溢出有关注的价值,因其附近有与控制相关的数据:已保存的函数返回地址。

这一点很重要,Exploit执行的结果就是,控制或劫持程序的执行流程。而寻找与控制相关的数据,是极关键一步。

但栈溢出通常难以利用,因Android从第一个版本开始,就开启了Stack Cookie的保护

4.堆溢出利用,与之前博客总结的Linux堆溢出利用一致。但需理清一个概念。操作系统只提供基于页的内存分配机制,堆分配器基于页分配机制将页再分成块,一般由C运行时库实现,如Android系统中Bionic libc库实现的dlmalloc分配器。

5.我们依然寻找堆中与控制相关的数据,可以发现有两种。一种是用于堆结构组织的控制指针,即链表指针。一种则是应用相关指针,如C++虚函数表指针。

第一种也很难利用了,因为目前dlmalloc等堆分配器实现中,UNLINK操作时会进行安全检查。主要检查的是,1)当前内存块向前指针指向的块的向后指针,指向当前块。2)当前内存块向后指针指向的块的向前指针,指向当前块。

而第二种应用相关指针,更加容易利用。

6.针对5我们可以举一反三,程序会定制为自身优化过的分配器,如WebKit中的RenderArena,很容易发现其中也有可被利用的虚函数表指针。

3 一个实例

看一个GingerBreak漏洞利用实例,漏洞本身很简单,是一个未校验数组下标下界,导致可传入负值造成任意写4字节内存。但漏洞利用分析的方法,可以总结一下。

经典漏洞利用过程:

1.获取内存读写权限(本例中任意写4字节)

2.泄漏内存指针(本例使用全局偏移表GOT,将strcmp项写为system地址)

3.通过内存读写能力,修改泄漏地址。并触发exp执行。(本例中发送一个NETLINK请求)

我们将几种最常见的漏洞利用过程,向这个步骤对齐。

一、栈溢出

1.获取内存读写权限。——栈空间由strcpy()等写入

2.泄漏内存指针。——通过调试崩溃,可直接取函数返回地址位置。

3.触发exp执行。——函数退栈返回时自动触发。

二、堆溢出

1.获取内存读写权限。——堆空间由strcpy()等写入。

2.泄漏内存指针。——直接计算堆内存块向前及向后指针。

3.触发exp执行。——unlink时触发。

三、逻辑漏洞

1.获取内存读写权限。——mmap/get_user/set_user未校验边界,导致读写任意内存。

2.泄漏内存指针。——通过搜索/proc/kallsyms,查看崩溃日志打印等获得如setresuid等符号地址。

3.解发exp执行。——函数调用。

四、UAF(CVE-2015-3636为例 pingpong)

1.获取内存读写权限。——由用户控制的数据占用内核对象(slab块/socket对象)。

2.泄漏内存指针。——用户态的一个悬挂指针。如socket fd.

3.触发exp执行。——函数调用。构造一次connect()。

展开阅读全文

没有更多推荐了,返回首页