编辑: 飞翔的荷兰人 | 2017-09-16 |
txt http://www.phrack.org/issues.html?issue=66&
id=12#article Alphanumeric RISC ARM Shellcode |=--=[ Yves Younan ([email protected]) / ace ([email protected]]=--=| Pieter Philippaerts ([email protected]) 只含字母数字的ARM体系ShellCode rodent翻译 目录
0 - 介绍
1 - ARM体系结构 1.0 - ARM处理器 1.1 - 协处理器 1.2 - 寻址模式 1.3 - 条件执行 1.4 - 指令示例 1.5 - Thumb指令集
2 - 只含字母数字的Shellcode 2.0 - 字母数字bit特征 2.1 - 寻址模式 2.2 - 条件执行 2.3 - 指令列表 2.4 - 从一个寄存器里得到已知值 2.5 - 写入寄存器R0-R2 2.6 - 自修改代码 2.7 - 指令缓存 2.8 - 进入Thumb模式 2.9 - 进入ARM模式
3 - 结论
4 - 致谢
5 - 参考文献 A - Shellcode 附录 A.0 - 可写内存 A.1 - ShellCode样例 A.2 - 最后生成的字节 --[ 0.- 介绍 随着移动设备的迅猛发展,ARM处理器世界上最为广泛流传的处理器核心之一.ARM处理器在电源使用和处理能力之间有很 好的权衡,使得它成 为移动和嵌入式设备非常优秀的候选方案.大部分移动电话和个人掌上电脑(PDA)都使用ARM处理器. 但是也只是最近,这些设备才发展到强大到能允许用户连接到internet上各种不同的服务,以我们通常的桌面电脑上熟知 的方式来分享信息. 不幸的是,这引入了很多安全风险. 像PC系统一样,ARM本地应用程序很容易受到诸如缓冲区溢出和其他对输入验证不恰当漏洞的发掘利用等的攻击.一直以 来,因为只有功能全面 的桌面电脑系统才能连接到internet上,使用通用普适的方法传播信息,因而大部分的攻击都专注于主流的桌面电脑处理 器上,也就是x86处理 器. 鉴于基于ARM的设备的连接性的增长和对这些设备的潜在的不正当使用(比如,让一个被侵入的手机呼叫一个商业电话号 码),将来对这些设备 的攻击将远比现在普遍. Shellcode必须通过一个或多个过滤系统才能到达易受攻击的缓冲区是入侵编写者所遇到的典型障碍.一个过滤方法通常会 对输入作简单的检查 ,比如严格检查输入是否和一个预定义好的特殊的模式匹配.打个比方,一个通常使用的正则表达式是[a-zA-Z0-9](或许 还会加上空格 ) .入侵监测系统也通常会增加更多的检查来发现特殊模式的操作码序列,以达到侦测攻击的目的. 第1页armshellcode.txt 出于普及知识的目的,我们在这篇文章里讲述如何编写ARM系统上只含有字母数字的shellcode.这很重要,因为字母数字 串可以通过更多的有 效性检查,而且通常比非字母数字的shellcode更能在数据变换(比如从一种编码方式变换成另外一种)后保持原状.在使 用定长4字节指令的 精简指令集系统上编写只含有字母数字的shellcode可不是轻而易举的. 当我们讨论字节中的bit时,我们会使用如下的表示:在我们的讨论中大端bit是bit 7,小端比特是bit 0.一条指令的第 一个字节是从bit
31 到bit 24,最后一个字节是从bit 7到bit 0. --[ 1.- ARM体系结构 ----[ 1.0 ARM处理器 ARM体系是一个32-bit精简指令集计算机体系,拥有16个供通常程序使用的通用寄存器和一个状态寄存器(实际上还有更多 的通用寄存器和状态 寄存器,但是那些都只用在了异常模式下,对于我们的讨论不重要).每条指令是四字节,所以我们需要保证所有这4个字 节都是字母数字.这 和变长指令系统X86有显著区别.因而在ARM上得到完全是字母数字的指令序列比在X86上要难得多. 寄存器R0-R12是真正的通用寄存器,没有特定的用途.寄存器R13用作栈指针,通常被叫做SP寄存器.寄存器R14用作链接 寄存器,也被叫做LR .这个寄存器存储函数或异常的返回值.寄存器R15保存当前程序计数,也叫做PC寄存器.和X86体系不同,我们可以直接 读写PC寄存器.从这 个寄存器读取的内容是当前指令地址值+8字节(ARM模式)或是当前指令地址值+4字节(Thumb模式)(见1.5节).写入PC 寄存器后,程序会从 写入值指向的地址处开始执行. ARM处理器有很多版本,版本6增加了很多新指令.在这篇文章里,我们试图尽可能得保持宽泛,我们的ARM字符数字 Shellcode应该可以工作在 各个不同的ARM处理器版本.为达到这样的目的,我们将不使用那些需要特殊版本处理器支持的那些指令.但是,我们会明 了的标明哪些指令是 因为自身不是字符数字而不使用以及那些指令是因为兼容性限制而不被使用.这样允许那些只需要满足特定版本处理器兼 容性的shellcode编写 者可以充分利用那些版本里特殊的指令. ----[ 1.1 协处理器 ARM处理器的功能可以通过很多协处理器来扩展以完成很多非标准的计算和避免用软件的方式完成这些计算.ARM最多支持 16个协处理器,每个 协处理器有唯一的标示符.一些处理器可能需要超过一个标示符以实现大量的指令集.协处理器可用于内存管理,浮点数 运算,调试,多媒体 ,密码学等等 当ARM主处理器遇到自己无法处理的指令时,它就将这个指令发送到协处理器的总线上.如果一个协处理器识别这个指令, 它就执行这个指令并 回复给主处理器.如果没有一个协处理器做出回应,那么会产生'