在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

最新文章

  1. 【精粹系列】PHP精粹
  2. Java中request请求之 - 带文件上传的form表单
  3. Java实现动态代理的两种方式
  4. Socket Programming in C#--Introduction
  5. jmeter线程组之间传递参数
  6. C#读取Word文档内容代码
  7. 3种方式实现可滑动的Tab
  8. 基于C++11线程池
  9. Java编译成功,用java 运行class时出现错误解决方法
  10. jQuery如何创建元素
  11. 从用eclipse还是idea所想到的
  12. 从Unity中的Attribute到AOP(六)
  13. class 选择器
  14. 1.单件模式(Singleton Pattern)
  15. bzoj1912 树形dp求直径(新写法),求直径的两端点
  16. 【转载】systemctl命令完全指南
  17. Git 提交更新到仓库(分布式版本控制系统)
  18. adb 切换android输入法
  19. MyBatis SqlSessionDaoSupport实例
  20. Nginx七层反向代理和负载均衡

热门文章

  1. Python--day36--操作系统的作用;多道技术;
  2. P1024 硬币问题
  3. win10 uwp 如何使用DataTemplate
  4. H3C备份/恢复下次启动配置文件
  5. maven仓库总结,maven私服搭建,批量mvn eclipse:eclipse
  6. Linux 内核 启动时间
  7. windows添加右键菜单
  8. redis scan count的含义/二进制安全问题
  9. 小白学 Python 爬虫(30):代理基础
  10. Spark RDD的弹性到底指什么