Android 漏洞分析基础
文章平均质量分 96
杏林小轩
故不积跬步,无以至千里;不积小流,无以成江海。
展开
-
dlmalloc 2.8.6 源码详解—[1]chunk
转载自:vector032 标记结构本章节将介绍基本的内存标记结构,包括chunk, tree chunk, sbin, tbin, segment, mstate等.这些重要的机构组成了dlmalloc分配算法的基础.2.1 chunkchunk是dlmalloc中最基本的一种结构,它代表了一块经过划分后被管理的内存单元. dlmalloc所有对内存的操作几乎都聚焦在chunk上.需要注意的是,转载 2016-12-04 20:49:55 · 1614 阅读 · 0 评论 -
jemalloc 3.6.0源码详解—[5]分配及实现
转载自:vector033 分配3.1 概览在2.3.2节中得知, jemalloc将size class划分成small, large, huge三种类型. 分配时这三种类型分别按照不同的算法执行. 后面的章节也将按照这个类型顺序描述.总体来说, jemalloc分配函数从je_malloc入口开始, 经过,je_malloc -> imalloc_body -> imalloc -> imall转载 2016-12-27 18:31:34 · 3150 阅读 · 0 评论 -
dlmalloc 2.8.6 源码详解—[5]释放及实现
转载自:vector034 释放与实现释放过程相对分配就简单多了, 基本着重在chunk合并, top裁剪, segment释放上. dlmalloc中合并是减少外部碎片最有效的方法了.4.1 dlfree释放的主要过程就是根据用户传入的payload, 找到chunk指针, 然后分别检查前一个和后一个chunk是否可以合并. 这里唯一需要注意的就是与dv和top这些特殊chunk的交互.基本流程如转载 2016-12-04 23:21:37 · 571 阅读 · 0 评论 -
Android ROP利用技术
出发点早期的缓冲区溢出攻击,因为当时终端都未使用ALSR缓解技术,攻击者通常会把“邪恶代码”部署在栈中,劫持PC指针后指向栈中的部署好的代码进行执行。后来为了应对这种缓冲区溢出攻击,操作系统安全厂商开发了防止数据执行(XN)缓解技术,部分弥补了冯·诺依曼计算机体系结构中数据和代码在内存未进行区分的问题,使进程虚拟空间中的数据区、栈区和堆栈区不能再执行机器代码, 从而有效的缓解了早期的缓冲区溢出攻击原创 2016-12-28 17:48:07 · 1218 阅读 · 0 评论 -
Android 防止数据执行(XN)缓解技术
出发点当缓冲区溢出发生后,成功利用还需解决两个问题:1)在内存中部署“邪恶代码”。2)定位部署好的“邪恶代码”入口点,劫持PC指向该地址。在早期由于操作系统还未引入ALSR机制,部署“邪恶代码”的问题很容易解决,比如,把“邪恶代码”直接部署到缓冲区中,溢出后劫持PC指向精确计算好的缓冲区基址开始执行: 究其根源,是计算机冯·诺依曼体系结构中没有对数据和代码进行区分,允许同一内存块中代码和数据共享存原创 2016-12-26 18:10:44 · 1073 阅读 · 0 评论 -
Android 栈溢出攻击—[2]调试分析
上一篇讲解了栈栈溢出攻击的基础原理,该篇作为基础原理的一个延展,通过调试分析一个简单的栈溢出漏洞,加深对栈溢出原理的理解。漏洞代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>void callsystem(){ system("/system/bin/sh");}void mPrint(char* str , in原创 2016-12-22 17:26:41 · 1567 阅读 · 0 评论 -
Android 栈溢出攻击—[0]原理
栈栈,是一种数据结构,是一个先进后出的数据表,所以会为其抽象出栈底和栈顶两个属性。简单的理解,可以用生活中的装书的箱子类比,我们取书的顺序和放书的顺序相反,即第一本放入的书最后才能取出。对栈的操作也非常简单:压栈和弹栈。如图,通常,在谈论栈溢出时,所指的栈是操作系统虚拟地址空间中的栈区stack:系统栈由系统自动维护(我们可以在编译器编译时指定大小),用于实现函数调用,下面来看下协同栈是如何协助实现原创 2016-12-06 17:44:22 · 2183 阅读 · 0 评论 -
Android 栈溢出攻击—[1]ARM平台栈溢出特点
由于每个平台的ABI(应用二进制接口)不同,所以各个平台上调用子函数时对参数、局部变量、返回地址和返回值的处理也是不一样的,目前Android的大部分终端使用的ARM平台,遵循的ABI叫做ATPCS,即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称。ABI主要解决了下面三个问题, 1. 被调用函数如何获取函数参数,即函数参数的传递规则。原创 2016-12-29 17:07:43 · 2125 阅读 · 0 评论 -
Android 堆溢出攻击—[0]原理
堆栈,是一种“先进后出”的数据表,正是由于这个特点,系统使用栈辅助函数调用及返回,函数中使用的局部变量在栈中分配,并在函数返回时会被销毁,也就是说对于函外部的程序来说函数内部的局部变量是不可见的,显然这样的变量不能完全满足程序的需求,比如,函数执行后需要把数据的改变传递到程序的其他部分,这样的需求很常见。虽然可以通过全局变量的方式的解决,但全局变量只能在编写程序时预先定义好,并在编译期间为全局变量分原创 2017-01-09 17:26:58 · 2383 阅读 · 1 评论 -
Android 栈溢出攻击—[3]ROP 浅析
在缓冲区溢出攻击攻防发展过程中ROP技术作为对抗XN的利用技术,一直发挥着重要的作用,在很多漏洞中其都是关键的攻击手段。本文通过一个简单的例子来对Android的ARM平台下ROP技术做一个简单的分析。原创 2017-01-03 10:22:15 · 1430 阅读 · 0 评论 -
Android Root及提供商:一把双刃剑
摘要Android Root 是一个自愿、合法获取设备最高权限和完全用户控制设备的过程,为了满足大众需求,一个独一无二的Android Root生态系统已经形成,也促使各种各样的Root提供商提供Root服务。尽管合法,以及许多通过Android系统漏洞的一键root方法,但假如没有控制好,这些利用会被恶意软件作者使用来获取未授权的特权。为了理解这些风险,我们对许多流行且神秘的Android roo翻译 2017-01-19 14:33:19 · 2300 阅读 · 0 评论 -
jemalloc 3.6.0源码详解—[6]释放及实现
转载自:vector034 释放4.1 概览释放同分配过程相反, 按照一个从ptr -> run -> bin -> chunk -> arena的路径. 但因为涉及page合并和purge, 实现更为复杂. dalloc的入口从je_free -> ifree -> iqalloc -> iqalloct -> idalloct. 对dalloc的分析从idalloct开始. 代码如下,JEMAL转载 2016-12-28 10:21:34 · 2544 阅读 · 0 评论 -
Android 地址空间随机化(ALSR)缓解技术
出发点常规的缓冲区溢出利用技术以及其衍生的Ret2libs和ROP利用技术在利用栈缓冲区溢出漏洞进行攻击时,需要事先熟悉被攻击进程的虚拟地址空间布局以便采用硬编码方式布局栈内存。由于操作系统每次加载进程和动态链接库时,基地址都加载到固定虚拟内存地址处,使缓冲区溢出漏洞易于劫持程序流程跳转到布局在栈内存的shellcode,即使开启XN缓解技术,采用ROP也很容易定位到系统库中的gadget,并劫持程原创 2016-12-06 15:30:01 · 4178 阅读 · 0 评论 -
dlmalloc 2.8.6 源码详解—[2]分箱(bins)
转载自:vector032.2 分箱(bins)内存分配器设计中需要解决的两个重要问题就是空间和时间的矛盾.所谓空间矛盾是指要减少两方面的内存浪费,一是来自分配器本身overhead信息的占用,另外则来自分配的chunk由于对齐或碎片化造成的利用率降低.而时间矛盾是指在最短时间内,以最小的时间复杂度,计算出应该返回给用户的内存量以及内存地址. dlmalloc应对这两个矛盾使用的核心算法就是分箱机制转载 2016-12-04 21:28:58 · 2082 阅读 · 1 评论 -
dlmalloc 2.8.6 源码详解—[3]核心数据结构malloc_state
转载自:vector032.3 区段(segment)在dlmalloc的内部结构中,除了基础的chunk外,还存在一种粒度更粗的结构,称为区段(segment).之所以需要额外引入这种数据结构是为了提升对非连续内存的管理能力. dlmalloc将连续内存划分到一个segment中管理,而段与段之间则是不连续的,所有的段都由一个mspace统一去管理.如果用户程序创建了多个mspace,这些mspa转载 2016-12-04 22:12:01 · 2552 阅读 · 0 评论 -
jemalloc 3.6.0源码详解—[4]Thread caches
转载自:vector032.7 Thread caches (tcache_t)TLS/TSD是另一种针对多线程优化使用的分配技术, jemalloc中称为tcache. tcache解决的是同一cpu core下不同线程对heap的竞争. 通过为每个线程指定专属分配区域,来减小线程间的干扰. 但显然这种方法会增大整体内存消耗量. 为了减小副作用,jemalloc将tcache设计成一个bookke转载 2016-12-05 21:02:03 · 2072 阅读 · 0 评论 -
jemalloc 3.6.0源码详解—[3]Run and bins
2.4 Run (arena_run_t)如同在2.1节所述, 在jemalloc中run才是真正负责分配的主体(前提是对small region来说). run的大小对齐到page size上, 并且在内部划分成大小相同的region. 当有外部分配请求时, run就会从内部挑选一个free region返回. 可以认为run就是small region仓库. **注:**run的大小就是其内转载 2016-12-05 20:48:07 · 3685 阅读 · 1 评论 -
jemalloc 3.6.0源码详解—[2]Chunk
转载自:vector032.3 Chunk (arena_chunk_t)chunk是仅次于arena的次级内存结构. 如果有了解过dlmalloc, 就会知道在dlmalloc中同样定义了名为’chunk’的基础结构. 但这个概念在两个分配器中含义完全不同, dlmalloc中的chunk指代最低级分配单元, 而jemalloc中则是一个较大的内存区域.2.3.1 overview从前面arena转载 2016-12-05 20:12:08 · 2965 阅读 · 0 评论 -
jemalloc 3.6.0源码详解—[1]Arena
转载自:vector032.2 Arena (arena_t)如前所述, Arena是jemalloc中最大或者说最顶层的基础结构. 这个概念其实上是针对”对称多处理机(SMP)”产生的. 在SMP中, 导致性能劣化的一个重要原因在于”false sharing”导致cache-line失效. 为了解决cache-line共享问题, 同时保证更少的内部碎片(internal fragmentatio转载 2016-12-05 19:50:30 · 4973 阅读 · 3 评论 -
jemalloc 3.6.0源码详解—[0]基础知识
转载自:vector031 介绍jemalloc最初是Jason Evans为FreeBSD开发的新一代内存分配器, 用来替代原来的phkmalloc, 最早投入使用是在2005年. 到目前为止, 除了原版jemalloc, 还有很多变种被用在各种项目里. Google在android5.0里将bionic中的默认分配器从dlmalloc替换为jemalloc, 也是看中了其强大的多核多线程分配能力转载 2016-12-05 18:32:53 · 6232 阅读 · 0 评论 -
dlmalloc 2.8.6 源码详解—[6]调试分析
分析堆溢出漏洞分析不能仅仅停留在了解dlmalloc堆分配器运行原理,还需要通过调试器观察其运行过程并在堆内存中识别堆的数据结构,这就像实习医生学习做手术一样,最终检验还是要在手术台上。1 调试代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<unistd.h>void func原创 2016-12-05 00:04:07 · 1099 阅读 · 0 评论 -
dlmalloc 2.8.6 源码详解—[4]分配及实现
转载自:vector033 分配及实现本章节介绍dlmalloc的分配算法和实现.由于存在多mspace的情况, dlmalloc使用了两套API.一套对应默认的mspace,以dl前缀开头,如dlmalloc, dlrealloc等.如果创建了自定义的mspace,则使用mspace开头的API,如mspace_malloc, mspace_realloc等.但两套API在基础算法上是一致的.我们转载 2016-12-04 23:09:54 · 1289 阅读 · 0 评论 -
dlmalloc 2.8.6 源码详解—[0]基础知识
前述Dlmalloc是一个著名的内存分配器,最早由Doug Lea在1980s年代编写.由于早期C库的内置分配器在某种程度上的缺陷,因此dlmalloc出现后立即获得了广泛应用,足见其出色的表现.尽管时至今日, dlmalloc中的技术在一些地方已然落后于时代,很多优秀的allocator如google的tcmalloc, freeBSD的jemalloc等在某些情况下性能可以达到dlmalloc的转载 2016-12-04 20:19:54 · 3109 阅读 · 0 评论 -
Android系统漏洞分析概述
本文描述了自己Android系统漏洞分析的理解,同时也作为自己学习漏洞分析的大纲,逐步规范漏洞分析的方法和步骤,最终构成自己的漏洞分析体系。1 概述漏洞分析是指在代码中迅速定位漏洞产生的位置(简称溯源),理解攻击原理,并根据漏洞类型、漏洞利用技术以及目标平台的漏洞缓解技术,准确评估该漏洞的利用方式和风险等级的过程。2 步骤漏洞分析是指在代码中迅速定位漏洞产生的位置(简称溯源)原创 2017-01-11 12:47:26 · 2881 阅读 · 0 评论