- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android系统shellcode编写
Android 系统shellcode 编写
文/ promised lu
随着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 为例,代码如下:
/* autogenerated by gensyscalls.py */
#include sys/linux-syscalls.h
.text @表示代码段
.type execve, #function @定义符号类型
.globl execve @导出符号到连接器
.align 4 @对齐到4字节边界
.fnstart
execve:
.save {r4, r7}
stmfd sp!, {r4, r7} @保存r4和r7
ldr r7, =__NR_execve @r7存放系统调用号
swi #0 @通过调用软中断,切换到特权模式,执行系统调用
ldmfd sp!, {r4, r7} @恢复r4和r7
文档评论(0)