Android栈溢出漏洞利用练习

在Github上看到一个Linux系统上的栈溢出漏洞利用练习项目: easy-linux-pwn。在原项目基础上,我稍微做了一些改动,将这个项目移植到了Android 9.0系统上: easy-android-pwn。对Android漏洞利用有兴趣的可以练习一下。

由于Android系统与其他Linux桌面系统在安全配置上有下面两方面的差异,导致此项目不能直接在Android系统上使用。需要对系统做一些改动,重新编译ROM(或者仅编译替换linker程序)。

  1. 即使通过echo 0 | sudo tee /proc/sys/kernel/randomize_va_space命令关闭ASLR,Android系统上lib库加载地址仍然是随机化的,这是由Android linker额外实现的机制
  2. Android NDK编译系统强制使用-z noexecstack选项,导致编译出来的二进制文件无法开启栈上执行权限

按照如下步骤进行设置:

  1. 按照原项目easy-linux-pwn中的说明进行设置
  2. 按照以下改动修改linker代码,重新编译ROM
    diff --git a/linker/linker.cpp b/linker/linker.cpp
    index c78b9aba6..d20995162 100644
    --- a/linker/linker.cpp
    +++ b/linker/linker.cpp
    @@ -1493,13 +1493,13 @@ static bool find_library_internal(android_namespace_t* ns,
    
     static void soinfo_unload(soinfo* si);
    
    -static void shuffle(std::vector<LoadTask*>* v) {
    -  for (size_t i = 0, size = v->size(); i < size; ++i) {
    -    size_t n = size - i;
    -    size_t r = arc4random_uniform(n);
    -    std::swap((*v)[n-1], (*v)[r]);
    -  }
    -}
    +// static void shuffle(std::vector<LoadTask*>* v) {
    +//   for (size_t i = 0, size = v->size(); i < size; ++i) {
    +//     size_t n = size - i;
    +//     size_t r = arc4random_uniform(n);
    +//     std::swap((*v)[n-1], (*v)[r]);
    +//   }
    +// }
    
     // add_as_children - add first-level loaded libraries (i.e. library_names[], but
     // not their transitive dependencies) as children of the start_with library.
    @@ -1603,7 +1603,7 @@ bool find_libraries(android_namespace_t* ns,
           load_list.push_back(task);
         }
       }
    -  shuffle(&load_list);
    +  // shuffle(&load_list);
    
       for (auto&& task : load_list) {
         if (!task->load()) {
    diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
    index a5eab44ec..4c6cdf494 100644
    --- a/linker/linker_phdr.cpp
    +++ b/linker/linker_phdr.cpp
    @@ -548,6 +548,7 @@ static void* ReserveAligned(void* hint, size_t size, size_t align) {
       uint8_t* first = align_up(mmap_ptr, align);
       uint8_t* last = align_down(mmap_ptr + mmap_size, align) - size;
       size_t n = arc4random_uniform((last - first) / PAGE_SIZE + 1);
    +  n = 1;
       uint8_t* start = first + n * PAGE_SIZE;
       munmap(mmap_ptr, start - mmap_ptr);
       munmap(start + size, mmap_ptr + mmap_size - (start + size));
  3. 使用 switch_execstack工具开启04和05两个练习的栈执行权限。
  4. 关闭ASLR:adb shell ‘echo 0 > /proc/sys/kernel/randomize_va_space

原文地址:https://www.cnblogs.com/ntiger/p/12215630.html

时间: 2024-08-19 09:40:38

Android栈溢出漏洞利用练习的相关文章

Android内核漏洞利用技术实战:环境搭建&amp;栈溢出实战

前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是arm汇编以及环境的搭建方面.本文对我最近的实践做一个分享,其实很简单. 内核调试环境搭建 搭建平台: ubuntu 16.04 这里使用 android 模拟器来进行内核调试.首先下载内核代码 git clone https://aosp.tuna.tsinghua.edu.cn/kernel/g

路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析

这次笔者来复现一个比较经典的栈溢出漏洞:D-link dir-815 栈溢出.其实这个路由器的栈溢出漏洞的利用方式和之前 DVRF 靶机平台的栈溢出例子大同小异,只是需要注意下一些小的地方. 前言 这个栈溢出的原因是由于 cookie 的值过长导致的栈溢出.服务端取得客户端请求的 HTTP 头中 Cookie 字段中 uid 的值,格式化到栈上导致溢出. 漏洞分析 大体流程 首先还是先将 cgibin 加载到 IDA 中,定位到 sobj_get_string 函数. 在 sobj_get_st

Vivotek 摄像头远程栈溢出漏洞分析及利用

Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 Crash 的 PoC :https://www.seebug.org/vuldb/ssvid-96866 该漏洞在 Vivotek 的摄像头中广泛存在,按照官方的安全公告,会影响以下版本 CC8160 CC8370-HV CC8371-HV CD8371-HNTV CD8371-HNVF2 FD81

栈溢出漏洞的利用和缓解

一直有人说这个时代做渗透太难了, 各个平台都开始重视安全性, 不像十几年前, 随便有个栈溢出就能轻松利用. 现在的环境对于新手而言确实不算友好, 上来就需要 面临着各种边界保护, 堆栈保护, 地址布局随机化. 但现实如此, 与其抱怨, 不如直面现实, 拥抱变化, 对吧? 本文所演示的环境为64位Linux+32位ELF程序. 文中所用到的代码和exp皆可在github仓库中找到. 前言 知识准备 首先, 当然是要先了解什么是栈溢出. 要了解栈溢出, 就必须要先知道栈的布局. 以32位应用程序为例

20155306 白皎 0day漏洞——漏洞利用原理之栈溢出利用

20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分: 代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行. 数据区:用于存储全局变量等. 堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区.动态分配和回收是堆区的特点. 栈区:用于动态地存储函

linux kernel pwn notes(内核漏洞利用总结)

前言 对这段时间学习的 linux 内核中的一些简单的利用技术做一个记录,如有差错,请见谅. 相关的文件 https://gitee.com/hac425/kernel_ctf 相关引用已在文中进行了标注,如有遗漏,请提醒. 环境搭建 对于 ctf 中的 pwn 一般都是给一个 linux 内核文件 和一个 busybox 文件系统,然后用 qemu 启动起来.而且我觉得用 qemu 调试时 gdb 的反应比较快,也没有一些奇奇怪怪的问题.所以推荐用 qemu 来调,如果是真实漏洞那 vmwar

Android常见漏洞

Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏洞描述: 漏洞可导致中间人攻击 修改建议: 建议不要忽略ssl认证错误 漏洞名称: sql注入漏洞 漏洞描述: 漏洞可能导致用户数据库中的信息泄露或者篡改 修改建议: 建议使用安全sqlite,如sqlcipher 漏洞名称: https空校验漏洞 漏洞描述: 漏洞可导致中间人攻击 修改建议: se

Android APP漏洞挖掘

0x00 1.组件公开安全漏洞 参考Android 组件安全. 2.Content Provider文件目录遍历漏洞 参考Content Provider文件目录遍历漏洞浅析. 3.AndroidManifest.xml中AllowBackup安全检测 参考两分钟窃取身边女神微博帐号?详解Android App AllowBackup配置带来的风险. 4.Intent劫持风险安全检测 参考Android组件通信过程风险. 5.数据存储安全检测 参考Android Database配置模式安全风险

基于自适应热补丁的Android内核漏洞生态修复方案

1. 背景 Android内核漏洞严重影响了Android平台的安全.一旦内核被攻破,所有依赖内核完整性的安全机制都岌岌可危(比如加密.进程隔离.支付.指纹验证等).作为Android平台最后的防线,TrustZone也会受到威胁,因为内核可以从很多被信任的接口向TrustZone发起攻击.因此,理想情况下Android生态圈应该及时消灭内核漏洞.然而从Google的Android Security Bulletin上看,Android内核漏洞的数量呈飞快上涨的趋势(Figure 1所示).虽然