Liuw's Thinkpad

想要赢就先学会输,想要成功就先学会失败

Archive for the ‘exploit’ tag

Windows Mobile栈溢出漏洞利用

with 6 comments

这是暑期实习的成果。原来查了Phrack和PacketStorm等网站,都没有发现这方面的文档。

这篇文章主要解决了如何编写Unicode-proof ARM Shellcode的问题,个人觉得还是比较有意义的。其实也不一定是局限于Windows Mobile系统,只要是ARM架构,遇到要写Unicode-proof Shellcode这样的问题,这篇文章里面的方法都可以作为参考,因而放上来与大家一起分享。

本文采用Attribution-Noncommercial-Share Alike 2.5 China Mainland授权。

文章有点长,所以只放目录了,有兴趣看的再下PDF吧由于和导师有协议,所以不能把文章放出来,实在需要的联系我。

目 录
第一章 绪论 4
1.1 研究背景和意义 4
1.2 章节安排 4
第二章 相关概念和工具 5
2.1 Windows Mobile 6.1系统 5
2.2 ARM架构 5
2.3 Unicode编码 6
2.4 缓冲区溢出漏洞 6
2.5 相关工具软件 6
第三章 ARM架构 7
第四章 Windows CE 5.2 7
4.1 Windows CE 5.2的内存架构 7
4.2 当前运行进程的内存映射情况 9
4.3 Windows CE 5.2下的ARM栈祯结构 10
4.4 Windows CE 5.2下的ARM汇编 10
4.5 Windows CE 5.2系统安全性分析 11
第五章 漏洞分析与攻击 12
5.1 漏洞描述 12
5.2 漏洞成因 12
5.3 分析与攻击 12
第六章 已知的Shellcode编写技术 14
6.1 IA-32上Unicode-proof Shellcode的编写 14
6.2 纯数字字母的ARM Shellcode的编写 15
6.3 对两个方法的总结 16
第七章 Unicode-proof ARM Shellcode 16
7.1 ARM与x86在Shellcode编写上的差异 17
7.2 指令分析 17
7.2.1 Condition field 17
7.2.2 Data-processing instructions 18
7.2.3 Branch instructions 21
7.2.4 Load and store instructions 23
7.3 Shellcode编写方法:DirectConstructor 24
7.4 Shellcode实例:DirectConstructor方法 26
7.5 Shellcode编写方法:MagicLoopDecoder 31
7.6 Shellcode实例:MagicLoopDecoder方法 32
7.7 对编写Shellcode的一些建议 36
第八章 总结和展望 36
8.1 项目已完成部分 37
8.1.1 对千千静听1.29版的攻击 37
8.1.2 Unicode-proof ARM Shellcode的编写方法 37
8.1.3 辅助工具的编写 37
8.2 未来工作 37
8.2.1 Thumb状态指令Shellcode的编写 37
8.2.2 全自动化Shellcode生成工具的编写 38
参考文献 38
致谢 39
附录 40
A.1 trans工具的使用 40
A.2 findmagic工具的使用 41

Written by liuw

September 1st, 2009 at 2:50 pm

Why Perl, not Python

with one comment

此post并不是想引起语言之争,只是自己的一个针对特定情况的小发现而已。

在信息安全领域,Perl和Python一直是安全工作人员的好帮手,开发快速,简单,无须编译直接运行……这些优点,使它们成为写injector/sender的不二选择。

一般来说,做exploit的初期,通常会需要发送大量的数据,一般来说比较常见的是这样的Perl语句:

$ perl -e 'print "A" x 10240'

我原来也一直在用这样的语句,但是今天想想,为什么一定要用Perl啊,Python其实也有一样的功能嘛:

$ python -c 'print "A" * 10240'

小测试了一下,原来用Perl还是有原因的——速度。Perl的速度还真不是盖的。当然,Perl出现得比较早,hacker们形成了传统也说不定。

$ time perl -e 'print "a" x 10240' > /dev/null

real    0m0.008s
user    0m0.000s
sys     0m0.008s
$ time python -c 'print "a" * 10240' > /dev/null

real    0m0.024s
user    0m0.001s
sys     0m0.023s

再写一个C程序,做同样的事情。

char buf[10240];
int i;
int main()
{
  for (i = 0; i < 10240; i++)
    buf[i] = 'a';
  write(1, buf, 10240);

  return 0;
}

C程序测试结果如下:

$ time ./test > /dev/null

real    0m0.005s
user    0m0.000s
sys     0m0.003s

果然还是C语言的最快,不过,Perl和Python在开发上的便捷性弥补了它们在速度上的小劣势。

再回到Perl和Python的比较上来,在做这一件事上,Perl比Python要快,这是没得说的了,数据说话。因此,在快速测试时,估计我以后也是用Perl来直接输出字符串了。不过在写正式的exploit时,Python比Perl更整洁点,我还是会选择Python的。

Written by liuw

July 28th, 2009 at 4:13 pm