so链接
链接过程由soinfo_link_image函数完成,主要可以分为四个主要步骤:
1.定位dynamic section 由函数phdr_table_get_dynamic_section
完成,该函数会遍历program header,找到为类型为PT_DYNAMIC
的header, 从中获取的是dynamic section的信息,主要就是虚拟地址和项数。
链接过程由soinfo_link_image函数完成,主要可以分为四个主要步骤:
1.定位dynamic section 由函数phdr_table_get_dynamic_section
完成,该函数会遍历program header,找到为类型为PT_DYNAMIC
的header, 从中获取的是dynamic section的信息,主要就是虚拟地址和项数。
目前Android应用加固可以分为dex加固和Native加固,Native加固的保护对象为Native层的so文件,使用加壳、反调试、混淆、VM等手段增加so文件的反编译难度。目前最主流的so文件保护方案还是加壳技术, 在so文件加壳和脱壳的攻防技术领域,最重要的基础的便是对于Linker即装载链接机制的理解。本文分析了so文件的装载和链接过程,也就是在调用dlopen(“libxx.so”)之后,Linker的处理过程,还对so加壳的关键技术进行了简要介绍。
本文基于Android5.0 AOSP源码,仅针对ARM平台。
之前写过用VMware调试Linux Kernel,今天又尝试了一下VirtualBox+gdb的组合。
我的环境,主机:Ubuntu14.04
虚拟机:VirtualBox5.1
客户机:Ubuntu12.04.5 x64
1.首先在VirtualBox上安装客户机
编译安装linux-3.13内核(一般是将源码放到/usr/src中):
这是篇文章主要介绍一下Linux内核中的ROP chain如何构造来提升用户权限。内核ROP经常用来绕过和非可执行内存区域相关的限制,例如,在默认内核上,它提供了一种可以绕过内核和用户地址分离缓解技术(例如SMEP)的方法。
结果成功需要满足如下条件:
在典型的ret2usr
攻击中,内核执行流被重定向到一个用户空间的地址,这个地址中包含了提权的载荷:
之前的Linux内核调试都是编译内核源码后,用qemu启动来调试,但是实际一些Linux的发行版还是需要用其他的虚拟机软件来进行调试,这里记录一下VMware调试环境的搭建过程。
主机是Ubuntu14.04 x86_64
VMware Workstation 12.5.6
虚拟机是Ubuntu12.04.5 x86_64
主机选择Ubuntu是因为需要用gdb对VMware中的Linux Kernel进行调试,选择这个版本的虚拟机是因为有一篇关于内核ROP的文章用到的这个版本,为了方便后面做实验选择这个版本。
配置过程如下:
angr是一个Python实现的二进制分析框架,实现了程序插桩、符号执行等二进制分析技术,还在安全顶会S&P发表了一篇论文。
该项目的Github: https://github.com/angr/angr