编辑: 匕趟臃39 2015-08-25
Win32 Egg Hunting 秋风寒 一朵雪花

20010704 译 首发于看雪论坛 前言 距离复活节还有一段时间,不过现在也许正是探讨寻找彩蛋方式的好时机(我们正好可以为复活节女郎给我们 带来的下一个 0Day 漏洞做好准备) .

这套编写 exploit 指南系列的开头部分, 已经讲述了如何利用栈溢出来执行我们的代码的方法. 过去我们编写的 所有 exploit 中,保存 shellcode 代码的地址要不是静态的(至少差不多是) ,要不就是保存在某个寄存器中,所以这 个地址是稳定的和可靠的. 接下来的部分讲述了各种各样跳转到 shellcode 的技术, 这其中还包括了那些需要利用一个甚至几个跳板才能找 到shellcode 的复杂技术.在这些示例例子中,栈上的有效内存空间总是足以保存整个 shellcode 代码. 那么如果可用的内存放不下整个 Shellcode 代码怎么办呢?这时我们就要用到一种被称之为寻找复活节彩蛋 (egg hunting)的技术(下文起我们将简称 寻蛋 ) .寻蛋技术是 Staged shellcode 技术的一种.寻蛋是利用一小段 代码来在内存中寻找真正的(代码尺寸较大的)shellcode(the egg )的技术.换句话说就是:首先一小段代码被执行, 然后找到真正的 shellcode 并执行. 使用这项技术需要三个前置条件: 1. 必须能够跳转(jmp, call, push/ret)并执行一些 shellcode.这时有效的缓冲区内存可以相对小一些,以为这 时只需要保存那些寻蛋代码(egg hunter) .寻蛋代码必须被放置在预先设定的位置,这样才能控制代码 可靠的跳转到寻蛋代码并执行寻蛋代码. 2. 最终要执行的 shellcode 必须在内存的某个位置(堆、栈等)存在. 3. 必须自爱最终要执行的 shellcode 的前面放置唯一的标识.最初执行的 shellcode(即寻蛋代码)将逐字节 的搜寻内存来寻找这个标识.找到后就通过 jmp 或call 指令来开始执行跟在标识后的代码.这就意味着 首先必须在寻蛋代码中定义这个标识,然后并把这个标识写在实际的 shellcode 前面. 搜寻内存需要花费相当多的处理器时间并且可能要持续一段时间,所以使用寻蛋代码时,我们会遇到以下 问题: ? 一段时间内(当搜索内存时)cpu 被完全占用. ? 经历很长一段时间后,shellcode 才能开始执行(想象我们有 3G 的内存可以搜索) . 历史渊源和技术基础 关于这个专题,目前仅有少量文献面世:其中最好的论文是 Skape 很久以前写的;

你可以在这里找到些关于仅 在堆上进行搜索的寻蛋技术的材料. Skape 的论文是目前互联网上能找到的最好的关于寻蛋技术的参考资料.该论文包含了许多具体的技术和运行 在window 和linux 的例子,并且清楚明了的解释了寻蛋技术如何工作和安全的搜索内存的方法. 这里我将不再重复寻蛋技术背后的技术细节,因为 Skape 的论文已经详细的介绍了.这里我将用几个例子来展 示如何在栈溢出时使用这项技术. 有几点你需要牢记: ? 用到的标识需要是唯一的(通常你需要在寻蛋代码中用

4 个字节来定义标识, 然后把两个连续的标识 (8 个字节) 放在真正的 shellcode 前面). ? 对于一个特定的exploit , 必须测试哪个内存搜索技术可以工作.( 在我得系统上NTAccessCheckAndAuditAlarm 工作的最好) . ? 不同的技术需要不同大笑的存储空间来存储寻蛋代码: 利于 SHE 的寻蛋方法需要大约

60 个字节,利用 IsBadReadPtr 的寻蛋方法需要

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题