注:此帖会随时更新,我会根据大家的进展情况决定是否公布更多的提示,别忘了常来看~ 第一关
有一定C语言的知识就可以搞定,只要知道以下几点:
函数中声明的临时变量都是存储在堆栈里的,堆栈的地址是从高址向低址扩展的
exp1.c里面的四个变量是按照如下顺序放置的
+---------------------+
| password (10 bytes) |
+---------------------+ <-------低地址
| answer (10 bytes) |
+---------------------+
| yourname (20 bytes) |
+---------------------+
| ispassed (4 bytes) |
+---------------------+ <-------高地址
--------------------------我是分割线-------------------------
Do you know why gets() is dangerous and should not be used?
假如执行了gets(str),程序只会获取str变量的指针(不包含size信息),从这个地址开始,按照你的输入将字串写进内存,不会做任何边界检查
What you gonna do, then?;-)
--------------------------/我是分割线-------------------------
如果你还不会使用OllyDBG,赶紧学会。如果你不会调试,你的技术终究不会有大的进展。趁这个机会观察一下堆栈里的变量是什么样子的,学习一下怎么让程序断下来,程序的代码是怎么执行的。
==========================================
第二关
一个典型的本地栈溢出,对shellcode无编码要求。原理有点模仿ANI漏洞。
如果你还不了解缓冲区溢出的一般利用思路,请阅读《缓冲区溢出教程》第1-2章(附件里有)
如果你手头缺少shellcode,可以去网上找,比如metasploit.com上的在线生成shellcode,也可以参考下我给的教程,shellcode本来是可以拿来主义的东西,理解原理就行,就别放太多精力在上面了--除了溢出4。
====================Tips======================
如果你是个初学者,希望你能在这几天突击一下溢出,过掉1,2关
如果你并非初次接触溢出,希望你能挑战一下3,4关
另:时间足够,每届都有不少过关的孩子是现学的。
====================/Tips======================
====================================================
第三关
这关,如果你知道基于浏览器的溢出的原理,那么只值400分了
如果你读懂了那篇paper,就值300分了
如果你读懂了paper附带的代码,就连200分都不值了
----------------------科普的分割线-----------------
ActiveX溢出是发生在浏览器的内存空间里的,溢出成功后就会以当前浏览器的权限执行你的shellcode,说白了就是网马,原理和一般的溢出大同小异。
Sample.html里面已经给出了调用方法:
//在网页中调用ActiveX控件,创建出对象
var obj = new ActiveXObject("ISCC2009.OverFlow");
//执行它的一个方法,你试试把"调用成功"四个字换成一长串"A",然后用OD加载浏览器进程,看看报啥错?和普通的溢出一样吧
var a = obj.TestFunc("调用成功!");
你也可以用常规的溢出方法来构造,比如覆盖返回地址,覆盖异常;当然这些方法的通用性不太好(对于网马尤其要命),所以用的不多。在浏览器下我们还有更多的"帮凶"可以用,具体的去网上找教程吧,比如查查什么叫Heap Spray...现成的代码已经泛滥了
----------------------/科普的分割线-----------------
但这关也不白给,因为这题还要让你绕过DEP。
DEP就是数据执行保护,开启后所有不具备"执行"属性的内存,包括stack,包括heap,全部不可执行,违者报异常。手动开启和关闭的方法去google吧
出这个题并非是seer吃饱了撑的给大家增加难度,这题是有实战意义的,要知道在Vista以后的系统上,会默认为浏览器开启DEP(xp下默认是关闭的),也就是说包括Heap Spray在内的利用方法在Vista下都玩不转了。而在BlackHat2008大会上,两名大牛展示了一种绕过DEP,ASLR等Vista下内存保护机制的方法,不知大家看新闻了没有。题目里附带的就是他们的论文,请着重读".net"那一段,其实一点都不难,就是用.net控件在内存中开出地址可控而且有执行属性的内存分页,相当巧妙...如果你对溢出感兴趣,这是篇不容错过的经典文章。
Tips1:带有.net控件的页面必须经IIS发布,并且服务端和客户端都装有.net framework(vista默认也是装的),客户端浏览器才会对控件进行下载。直接点开是不行的。
Tips2:代码中给的那个现成的exploit.dll貌似有问题,请重新用exploit.cs编译一编。编译的命令是:
CSC /nologo /target:library /platform:x86 /noconfig /baseaddress:0x41410000 /reference:C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\System.dll /reference:C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\System.Windows.Forms.dll /out:exploit.dll exploit.cs
Tips3:成功部署后的shellcode会出现在exploit.dll内存映像中的.text段,地址固定,且有执行属性(.text段当然有了…)如下图

==========================================
第四关
很考验溢出基本功的一关,也是本人遇到过的真实挑战之一,源程序来自某门课老师给的范例程序,一行代码没改。
所谓的“可见字符”指的是ASCII码小于128(0x80)的字符,如果你还不知道涉及的主要技术是什么,去搜一下“数字字母shellcode”,或者”Alpha-numberic shellcode”。本题还涉及一些实战中比较常见的问题,比如如何在内存中寻找合适的指令,如何调整数字字母shellcode的解码头,如何微调你的指令以符合编码要求…等等。
===============================================================================
想挑战一下吗?Show me your magic, guy!