欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

Android系统shellcode编写

Android系统shellcode编写

    科普稿一篇,高手请自动路过
    随着Android手机的普及,Android系统安全日益受人关注。漏洞攻防是安全的一大课题,其中自然少不了shellcode的编写。本文将以提出问题、解决问题的方式教你如何编写Android系统shellcode。由于篇幅限制,本文将不对ARM指令集进行介绍,建议没有基础的读者先参考相关手册。
    1.基础部分
    使用什么工具?
    GNU ARM汇编器as和GNU ARM连接器ld是编写Android系统shellcode必不可少的两个工具。Android NDK提供了Cygwin、Mac和Linux版本的as和ld,为了方便在Windows环境下开发,笔者在附件中提供了Windows版本的as和ld。
    as和ld的使用方法很简单,假设sc.s是我们编写好的shellcode源文件,先使用as sc.s -o sc.o命令将sc.s汇编成目标文件sc.o,再使用ld sc.o -o sc将sc.o连接成可执行文件sc。文中用到的为数不多的as汇编伪指令将在相关注释中说明,具体请参考“Using as”手册。
    除了as和ld,我们还要用IDA作为反汇编器,IDA的使用想必不用多做介绍。用IDA记录下sc中shellcode的头部和尾部,就可以用十六进制编辑器从sc中提取shellcode了。
    函数参数如何传递?
    函数参数从左到右依次存入R0~R3,如果参数个数大于4个,则剩余参数从右到左依次入栈,返回值存入R0。
    如何给shellcode瘦身?
    ARM处理器支持两种指令集:ARM指令集和Thumb指令集。ARM指令集指令长度为32位,Thumb指令集指令长度为16位。Thumb指令集的限制更多,比如立即数大小只能在0到0xFF范围内。
    为了给shellcode瘦身,我们更倾向于使用Thumb指令集编写shellcode。ARM处理器总是从ARM指令集开始执行,所以我们的shellcode头部是一段ARM指令集程序,负责切换到Thumb指令集。
    如何自定位?
    自定位是编写shellcode的关键技术之一,也就是所谓GetPC。在x86环境下,通常有CALL GetPC、FSTENV GetPC、SEH GetPC三种方式。而在ARM环境下,事情就变得简单很多,因为指令指针PC可以直接访问。
    ARM汇编还提供了ADR伪指令,汇编器会将其转换为相对PC寻址的指令,所以我们不用担心自定位问题。值得注意的是,LDR指令通过绝对地址寻址,当基地址改变时根据重定位段信息进行重定位。用LDR指令寻址一个符号在shellcode编写中是错误的,这点和x86类似。
    如何定位函数?
    定位函数是编写shellcode的关键技术之二。在Windows环境下,通常通过PEB定位kernel32基地址,然后遍历kernel32输出表定位API。在Linux环境下,直接系统调用。
    Android系统调用由gensyscalls.py自动生成,以execve.S为例,代码如下:

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功