原文发表在
http://www.phrack.org/issues.html?issue=66&id=12#article
2009年正式发布

这篇文章主要讲了在ARM体系结构下如何编写只含有字母数字的shellcode。
虽然用arm汇编编写shellcode很难,但是通过一些现成可用的指令,自修改代码技术和代码缓存清空的技术,基本上所有程序都可以修改为只含字母数字的代码。作者最终得出arm下只含字母数字的shellcode是turing完备的结论。

第一次翻译,好累,翻译不好的地方请大家原谅,欢迎修正~

只含字母数字的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](或许还会加上空格" ")。入侵监测系统也通常会增加更多的检查来发现特殊模式的操作码序列,以达到侦测攻击的目的。

出于普及知识的目的,我们在这篇文章里讲述如何编写ARM系统上只含有字母数字的shellcode。这很重要,因为字母数字串可以通过更多的有效性检查,而且通常比非字母数字的shellcode更能在数据变换(比如从一种编码方式变换成另外一种)后保持原状。在使用定长4字节指令的精简指令集系统上编写只含有字母数字的shellcode可不是轻而易举的。

当我们讨论字节中的bit时,我们会使用如下的表示:在我们的讨论中大端bit是bit 7,小端比特是bit 0。一条指令的第一个字节是从bit 31到bit 24,最后一个字节是从bit 7到bit 0.

上传的附件 armshellcode.pdf