在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

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

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

    前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...

  2. 栈溢出漏洞利用流程——以syncbrs为例

    0x1 缓冲区溢出漏洞攻击简介 缓冲区溢出攻击是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击 ...

  3. 盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究

    本文作者:i春秋作家——cq5f7a075d 也许现在还研究Activex就是挖坟,但是呢,笔者是摸金校尉,挖坟,呸!盗墓是笔者的本职工作. 额,不扯了,本次研究的是阿里旺旺ActiveX控件imag ...

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

    20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样 ...

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

    Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...

  6. Linux kernel pwn notes(内核漏洞利用学习)

    前言 对这段时间学习的 linux 内核中的一些简单的利用技术做一个记录,如有差错,请见谅. 相关的文件 https://gitee.com/hac425/kernel_ctf 相关引用已在文中进行了 ...

  7. android CVE 漏洞汇总

    arm exploits 技术教程: Learning Pentesting for Android Devices CVE-2015-1530 ,CVE-2015-1474 两个android整数溢 ...

  8. Linux环境下常见漏洞利用技术(培训ppt+实例+exp)

    记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...

  9. Linux堆溢出漏洞利用之unlink

    Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...

随机推荐

  1. 微信里首次跳转会到首页问题(window.location失效)

    将window.location.href 换为location.href

  2. gitLab操作规范和项目流程

    刚做完一个项目并且艰难得上线,对整个项目流程和gitLab规范 有了一些心得,给新来的同学普及一下. 最先产品会写一篇需求文档,咱们要先看需求文档对项目有一个大致了解,然后产品喊后端.ui.前端  一 ...

  3. mysql常用基础语句学习

    常用sql语句 查询: SELECT 列名(或者*,表示所有列) FROM 表名 WHERE 筛选条件; FROM 表名:顾名思义,就是从表名指定的这张表格中: WHERE 筛选条件:意思是" ...

  4. Vscode 开发插件

    vs常用公共插件 Auto Close Tag 自动闭合标签 Auto Rename Tag 自动重命名标签 AutoFileName 自动联想文件名 Autoprefixer 自动兼容前缀 Auto ...

  5. CodeForces - 1162E Thanos Nim (博弈论)

    Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number ...

  6. ansible核心模块playbook介绍

    ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述.yaml之于json就像markdown之于html一样,极度简化了json的书写.在学习ansible pla ...

  7. 基于python的二分搜索和例题

    二分搜索 二分概念 二分搜索是一种在有序数组中查找某一特定元素的搜索算法. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束: 如果某一特定元素大于或者小于中间元素,则在数 ...

  8. PSR-1之PHP代码文件必须以不带BOM的UTF-8编码

    BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符 ...

  9. [梁山好汉说IT] 梁山好汉和秒杀系统

    [梁山好汉说IT] 梁山好汉和秒杀系统 0x00 摘要 今天看了一篇好文章,里面一些思路颇值得借鉴.先摘录总结精华.然后看看梁山好汉如何处理秒杀系统(系统隔离/系统搭建/风控过滤/削峰/信号广播... ...

  10. pyspider 安装使用过程的一些坑

    1.没有正确安装对应版本的pycurl 原因分析: PyCurl 安装错误,需要安装 PyCurl 库(PyCurl 是一个Python接口,是多协议文件传输库的 libcurl.类似于urllib ...