标题:【翻译】突破win2003 sp2中基于硬件的DEP

Similar documents
ROP_bamboofox.key

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

Linux kernel exploit研究和探索

返回导向编程 (ROP) 译者 :Netfairty 前言 欢迎来到第七部分, 经过前面的学习, 可能你想做一些更有挑战性的事. 好的, 本节我们将 要学习的是 ROP( 返回导向编程 ). 不像前一节我们把参数精心布置在堆栈然后调用 Windwos API 去执行它们. 所有介绍 ROP 教程都需

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字

且编写我们的利用程序, 到最后, 会简单讲一下, 这个漏洞的修补. 首先我们来了解下溢出产生的原因. 打开 windbg, 附加到 msue 进程上, 然后在 kernel!readfile 处下断点, 再用 muse 打开我们之前做好的 test.m3u( 注 : 在这个过程中, 会多次断在 Re

一 学 校 基 本 情 况 目 录 二 部 门 预 算 报 表 ( 一 ) 收 支 总 表 ( 二 ) 收 入 总 表 ( 三 ) 支 出 总 表 ( 四 ) 财 政 拨 款 支 出 表 三 部 门 预 算 报 表 说 明 ( 一 ) 收 支 总 表 说 明 ( 二 ) 收 入 总 表 说 明 (

目 录 一 学 校 基 本 情 况 二 2016 年 预 算 报 表 ( 一 ) 中 南 大 学 收 支 预 算 总 表 ( 二 ) 中 南 大 学 收 入 预 算 表 ( 三 ) 中 南 大 学 支 出 预 算 表 ( 四 ) 中 南 大 学 财 政 拨 款 支 出 预 算 表 三 2016 年

信息参考

Microsoft Word - 15dbtb007

linux 下的缓冲区溢出 裴士辉 QQ:

1 CPU interrupt INT trap CPU exception

上面的介绍会使我们的漏洞利用更清晰. 再次说明这篇教程不会覆盖所有的系列, 你还需要 做更多的研究. 好吧, 开始我们的旅途! 重现崩溃 是时候崩溃了 "Triologic Media Player 8". 这将是另一个文件格式的漏洞. 下面是 POC 和崩溃的截图, 你只需载入 evil.m3u

> u eip l 3 002f2aa9 90 nop 002f2aaa 90 nop >!chkimg -d -lo 1 ping // 检查文件是否被篡改? 002f2aa7-002f2aaa 4 bytes - ping!maincrtstartup [ e :f0 cc 9

鋼結構在綠建築發展趨勢中之綜合評價

Slide 1

Microsoft PowerPoint - 从漏洞到利用代码为Metasploit写_cn.ppt

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

Microsoft Word - 1-3陳詠琳-近代..

93年各縣國中教師甄試最新考情.doc

cve Wireshark 溢出漏洞分析及利用代码的分析 Wireshark 是一款非常流行的网络封包分析软件. 其方便性, 开源性和跨平台性和可扩 展性, 导至其有很广大的使用人群, 尤其做网络相关开发工作的程序员. 现在我们要分析的 Cve 这个漏洞是在对



#!/usr/bin/python -w filename="evil.plf" buffer = "A"*2000 textfile = open(filename, 'w') textfile.write(buffer) textfile.close() 创建 plf 文件, 用 immunit

"\x33\x31\x43\x17\x83\xeb\xfc\x03\x6b\x0c\xa6\x2b\x97\xda\xaf" "\xd4\x67\x1b\xd0\x5d\x82\x2a\xc2\x3a\xc7\x1f\xd2\x49\x85\x93" "\x99\x1c\x3d\x27\xef\x8

易语言逆向分析

经 济 高 速 增 长 和 其 后 又 比 其 他 发 达 资 本 主 义 国 家 更 为 顺 利 地 克 服 了 石 油 危 机 的 冲 击, 使 日 本 的 市 场 经 济 体 制 在 7 0 ~ 8 0 年 代 赢 得 了 国 际 社 会 的 广 泛 赞 誉 ( 其 间 虽 有 欧 美 国 家

2015 TB-1-06.indd

正式版

实验指导书

Untitled

Exploit 编写教程第一篇 : 基于栈的溢出 译 : 看雪论坛 -moonife 上个星期五 ( ), 一个叫 Crazy_Hacker 的人 (nick) 在 packetstormsecurity.org. 网站报告了一个存在于 Easy RM to M

Android 框架虚拟化实战 董福源 360 手机卫士 2017.thegiac.com

银川一职服装设计与工艺专业教学计划

WSADATA wsadata; int rval; char Message[5000]=""; char buf[2000]=""; u_short LocalPort; LocalPort = 200; //wsock32 initialized for usage sockversion =

使用!pvefindaddr 更容易的开发漏洞利用

中国矿业大学研招办

药大研〔2015〕78号

格式化字符串 Weifeng Sun School of Software, DLUT

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

ChinaBI企业会员服务- BI企业

untitled

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ==================

Untitled

动画光标文件(

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 图 1.5 图 三原色光的概念 R Red G Green B Blue RGB RGB R B 3 1 RGB RGB 256 0~ RGB

按 系 统 提 示 完 成 安 装 并 生 成 交 易 图 标, 双 击 图 标 即 可 运 行 金 阳 光 独 立 委 托 系 统 通 讯 设 置 按 钮 中 行 情 地 址 交 易 地 址 高 级 设 置, 其 中 行 情 地 址 交 易 地 址 可 以 分 别 用 来 设 置 服 务 器 地

Microsoft PowerPoint - XCon2010_win7_cn.ppt [兼容模式]


Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

实验指导书

Flash Exploit

<4D F736F F D20CEC4BCFEBCB6B6F1D2E2B4FAC2EBC9A8C3E8D2FDC7E6D6D0B5C4BCD3BFC7CAB6B1F0BCBCCAF52E646F6378>

DbgPrint 函数流程分析

目 录(目录名)

Windows Vista Windows ABC Windows Vista (1) 3-3 (2) 3-4 (3) 3-5 (4)

<4D F736F F D B77CC4B3ACF6BFFD2DB0D3B77EC2B2B3F8C2BEBAD82E646F63>

实验指导书

OptiROP:

1. 介绍 义隆 8 位单片机指令介绍 Application Notes 义隆 8 位单片机指令介绍 EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令

目 录

+00DE _01EN.book

微机第02章1(指令寻址)

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

学习MSP430单片机推荐参考书

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2

前沿技术 全面绕过执行流保护 安全研究部张云海 执行流保护 (CFG,Control Flow Guard) 是微软在 Windows 10 技术预览版与 Windows 8.1 update 3 中, 默认启用的一项缓解技术 在分析 CFG 的实现机制的过程中, 我们发现了一种全面绕过 CFG 的

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

0-Day 甘苦談 (0-Day WTF Talk) Happy Fuzzing Internet Explorer HITCON

不 知 肉 味 的 用 法 相 同? (A) 長 煙 一 空, 皓 月 千 里 (B) 五 臟 六 腑 裡, 像 熨 斗 熨 過, 無 一 處 不 伏 貼 (C) 兩 片 頑 鐵, 到 他 手 裡, 便 有 了 五 音 十 二 律 似 的 (D) 吾 觀 三 代 以 下, 世 衰 道 微 12. 文

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

实验指导书

净, 保 持 面 部 整 洁 这 里 要 说 一 下 的 是, 很 多 男 生 注 意 了 胡 子, 却 忘 了 鼻 毛, 而 旁 人 或 者 同 学 往 往 也 不 好 意 思 提 醒 建 议 面 试 前 一 定 要 仔 细 照 一 照 镜 子, 好 好 检 查 一 下 有 些 人 讲 话 多 了

99710a72ZW.PDF

学位中心〔2015〕 号

现在进入实验 4: PART A: 实现调度算法 第一步 : 修改 kern/sched.c 里面的函数 sched_yield, 具体代码如下 : 这个函数很简单, 就是从当前环境的下一个环境一直遍历到当前环境, 如果有可以运行的就 开始运行 如果没有, 就进入 idle 环境 然后修改系统调用,

一 专 业 名 称 专 业 名 称 : 会 计 二 入 学 要 求 与 基 本 学 制 入 学 要 求 : 初 中 毕 业 生 基 本 学 制 : 三 年 ; 其 中 前 二 年 为 在 校 学 习 时 间, 最 后 一 年 为 企 业 实 习 时 间 层 次 : 中 职 三 培 养 目 标 本 专

革 的 实 施 意 见 ( 国 办 发 号 ) 3. 广 西 壮 族 自 治 区 人 民 政 府 办 公 厅 关 于 实 施 广 西 高 等 教 育 强 基 创 优 计 划 推 进 高 等 学 校 创 新 创 业 教 育 改 革 的 通 知 ( 桂 政 办 发 号 )

Microsoft Word - Win32 缓冲区溢出实战.doc

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode]

「醫院總額支付委員會」第25次會議紀錄( )

前言

数据库系统概论

于是 run, 输入, 果然 :Phase 1 defused. How about the next one? 然后来看 phase2: 08048bb6 <phase_2>: 8048bb6: 55 push %ebp 8048bb7: 89 e5 mov %esp,%ebp 8048bb9:

Microsoft Word - 2CA13內文.doc

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

untitled

2011/9/26 大 陸 港 澳 地 區 線 上 申 請 平 台 現 況 報 告 3 大 陸 港 澳 地 區 線 上 申 請 平 台 現 況 報 告 六 月 七 月 八 月 第 一 類 觀 光 1706 人 人 人 郵 輪 人 0 自 由 行 297

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

Microsoft Word - Book 1 瑜伽行.doc

第 一 部 分 网 银 注 册 签 约 篇 山 西 省 农 村 信 用 社 个 人 网 上 银 行 为 客 户 提 供 账 户 管 理 转 账 汇 款 理 财 业 务 客 户 服 务 安 全 中 心 等 服 务 功 能 1. 网 上 银 行 用 户 类 型 个 人 网 上 银 行 客 户 采 用 数

目 录 序 言... 1 第 一 部 分 学 位 授 权 审 核 网 上 服 务 系 统 操 作 说 明 用 户 登 录 设 置 公 示 时 间 查 看 各 省 市 公 示 材 料 查 看 自 审 单 位 公 示 材 料... 3 第 二 部

财务制度

浙江省教育厅办公室关于印发《浙江省2015学年中小学教学用书目录》和《浙江省2015年中小学教辅材料推荐目录》的通知

Valgrind介绍

语 考 试 考 务 工 作 的 汉 考 国 际 教 育 科 技 ( 北 京 ) 有 限 公 司 ( 以 下 简 称 汉 考 国 际 ) 组 织 的 培 训 和 网 络 考 试 系 统 安 装 指 导, 并 签 署 汉 语 网 络 考 试 补 充 服 务 协 议 第 六 条 拟 新 申 请 成 立 汉

玩家 hacker 的结构体 : 地图的结构体 : 漏洞位置 : 在 local_attack 的时候, 使用了未初始化的变量, 如下图所示 : 其中 pointer_on_stack 指针放在栈上, 只有满足条件的时候, 才会被赋值, 所以如果能 够让 pointer_on_stack 不被赋值,

Transcription:

前置知识 : 汇编关键词 : 漏洞 Shellcode 堆栈 菜鸟版 Exploit 编写指南之五十六 : 2009 年第 10 期 突破 Windows 2003 基于硬件的 DEP 文 / david kennedy 译 / riusksk 创建数据执行保护 DEP(Data Exectution Protection) 的初衷是为了防止不可运行 的内存区域运行代码 在写本文之前, 我仔细阅读了 Uninformed 上 skape 与 Skywing 合写的文章 Bypassing Windows Hardware-Enforced DEP, 这是篇不错的文章, 值得一看 skape 与 Skywing 均是具备精明头脑的人, 是公认的 汇编超人 背景 开始之前, 我们先简单讲解堆栈溢出的基础知识 在当今现实世界中, 这类溢出已经很 普遍了, 是很容易发生的一类安全漏洞 只要程序员在编写程序时, 未对分配一定大小的特 定区域进行合适的边界检测即可发生此类情况 下面就以 SLMAIL 栈溢出为例说明 Offensive Security 安全组织的 Mati Aharoni 在 2004 年发现了 SLMAIL 这个漏洞, 该漏 洞的 exploit 正是利用了 SlMAIL POP3 SERVER(port 110) 中 PASS 域未进行有效的边 界检测而进行攻击的 关于该漏洞的分析可参 见 http://www.milw0rm.com/exploits/638 如果定位一下实际攻击发生的位置, 就会发现它是发生在 PASS+buffer 处,buffer 中包含 4654 个 A (\x41 触发溢出 ) shellcode 地址, 一些 nop 以及我们的 shellcode 为了实现溢出攻击, 只有通过覆盖 EIP 中指向的特定内存地址才可触发, 而 EIP 正是指向 系统即将运行的下一条指令的地址 如果我们能够控制 EIP, 那么就可以让系统执行到我们的 shellcode 地址 这类典型的 跳转地址通常为 call esp 或者 jmp esp, 并让 ESP 指向堆栈中特定的地址 ( 例如我们的 shellcode 地址 ) 通过分析这份 exploit 代码, 可以发现 4654 个 A 被发送到服务器 后, 接下来的 0x78396ddf 正是用来覆盖 EIP 并正确跳转到 shellcode 的内存地址 NOP 在汇编中用 \x90 来表示, 相当于 无操作 它并没有执行任何操作, 只是 继续执行下一条代码, 直到有效指令 当你无法 100% 确定它将运行到我们预想的地址时,

可以使其 滑行 一段距离, 直至 shellcode 与此同时, 它还可以删除一些被合法函数遗弃的垃圾字符 nop 被执行后, 将会运行包含恶意代码的 shellcode, 例如 reverse shell bind shell useradd 等 栈溢出的整个思路是 : 覆盖 EIP, 跳转到 shellcode(jmp esp), 执行 shellcode 如果你看一下这份 exploit 的日期以及测试平台, 就会发现 exploit 是在 Windows 2000 SP4 平台上测试的 如果 exploit 是运行在 Windows XP SP2 Windows 2003 SP1 或者 Windows 2003 SP2 上又会如何呢? 本文这里只谈论 Windows 2003 SP2, 因为每一操作系统在存在不同点的同时, 亦会 有相对的共同之处 在 Windows XP SP2 与 Windows 2003 SP1 上绕过 DEP 比 Windows 2003 SP2 更为容易, 因为 Windows 2003 SP2 内存中存在两项检测机制, 而其它系统 只有一项 ( 比较 AL 与 EBP 和 EBP 与 ESI) 实际测试 打开调试器 Immunity Debugger, 先从 milw0rm 上下载 exploit, 并通过调试器来运行它, 图 1 是在 *unix box 上运行 exploit 的截图 图 1 在调试器中, 可以看到被控制的堆栈中第一条指令发生了访问违例异常, 如图 2 所示 图 2

进一步分析, 右击 我的电脑 -> 属性 -> 高级, 打开 高级 后 ( 译注 : 在中文 Windows XP SP2 上, 是选择性能中的 设置 后才能看到 数据执行保护 ), 选择 数据执行保护, 接下来我们可以看到 为除下列选定程序之外的所有程序和服务启用 DEP(U): 的选项 为了 exploit 系统, 以此来提升访问权限, 就要克服上面的问题 既然已经知道了开启 DEP, 我们就需要将其禁止掉, 以便在被控制的栈中正确地执行 我们的 shellcode 幸运地是, 这里就有一种方法可以做到 在这份特殊的 exploit 当中, 我所使用的溢出方式尤为简单, 但在实际当中会遇到很多难以想像的困难 这里重述一下 Skape 与 Skywing 的一些观点 : 为了绕过 DEP 就必须调用函数 ZwSetInformationProcess( 在 LdrpCheckNXCompatibility 实例中 ) 当 ZwSetInformationProcess 函数被调用时, 通过相关设置来禁止 DEP, 以使程序 跳转到我们所控制的堆栈中 在深入分析之前, 我们先来看看这个函数的实际情况 我们将 会看到 NTDLL 中的地址 0x7C83F517, 正是 ZwSetInformationProcess 的起始点, 也 是禁止 DEP 的入口, 如图 3 所示. 图 3 通过上面的调用指令可知, 它先执行 MOV DWORT PTR SS:[EBP-4],2, 欲向指定的内存地址中写入立即数 2 如果寄存器被写入非法数据, 就会导致写入失败, 甚至产生之前我们所看到的异常事件 接下来, 将立即数 4 压入栈中, 将 EAX 入栈, 将 22 压栈, 将 -1 入栈, 最后调用函数 ZwSetInformationProcess 跟进函数之后, 来到如图 4 所示 的地方 图 4 上面的指令对 ESI 进行了一些操作, 因此 ESI 必须为一可写地址, 否则将会触发异常 现在我们需要让 EBP 与 ESI 指向可写的内存地址, 这样后续的指令才能得以运行 从 vanilla

SLMail exploit 代码来看, 它并未绕过 DEP, 执行之后将无法完全地绕过 NX 这里需要注意一下 LEAVE 这条指令, 它至少改变了 EBP 和 ESP 的值 现在的问题就是 EBP 是否指向了我们的 HEAP, 因此若想执行恶意代码, 就需要使其指向可控制栈的附近内存区域 图 5 是溢出时寄存器的情况 图中寄存器 ECX 指向了有利于我们的 HEAP, 因为它是可写的 如果想摧毁它, 我们仅需使用 heap spray 技术即可实现 不过我们需要来点更具创造性 的操作 图 5 其实更为理想的寄存器可以使用 ESP, 也可能是 ECX ESP 指针更为完美地接近我们 的 shellcode, 以及 ECX 指向的内存地址 注意, 为了禁止 NX,EBP 与 ESI 必须指向可 写的内存地址 我们先处理 EBP, 在 shell32 中找到指令 push esp pop ebp retn0x4, 内存地址为 0x7C93C899, 如图 6 所示 先将 ESP 的值压入栈中, 如图 7 所示 ESP 的 值为 01F3A154, 查看该地址的内容, 如图 8 所示 栈中显示为 01F3A158, 现在我们需 要将该值 POP 出栈给 EBP, 如图 9 所示 图 6 图 7 图 9

图 9 现在 EBP 指向了原 ESP 地址, 即 shellcode 邻近地址 接一来, 我们需要使 ESI 指向可执行区域 我们可以简单地使用 push esp push esp pop ebp pop esi,retn 或 者其它类似功能的指令来实现, 只不过需要在内存中搜索 这里我并没有找到合适的地址, 打算来点有创意的 我们需要使 ESI 指向可写的内存区域, 而 ESP 或者 ECX 在地址上亦须为有效 接着 看一下接下来的指令情况 注意, 这里很容易混淆 在地址 0x7C806B03 的指令为 pop ebx,retn, 这将使已经存在栈中的内存地址 pop 给 EBX 寄存器, 这样我们就可以注入 任意欲被执行的地址了 请看下面的代码 : # POP EBX,RETN 0x7C806B03 @NTDLL? disablenx+='\x03\x6b\x80\x7c' # 0x7C8043A3 will be EBX when POP # 为了绕过 NX 需要 ESI 为可写 #POP EDI,POP ESI, RETN 0x7c8043a3 @NTDLL disablenx+='\xa3\x43\x80\x7c' 当调用 NTDLL 中地址 0x7C806B03 处的指令时, 这将会 pop 0x7c8043a3 给 EBX, 如图 10 所示 但这仍然未起到什么效果, 因为 ESI 一直为错误地址 00000000, 接下来 被执行的指令为 :

图 10 #PUSH ECX,CALL EBX 0x7c934f57 @SHELL32 disablenx+='\x57\x4f\x93\x7c' #This will go to EBX(0x7c8043a3) 以上指令将 ECX 压栈, 并调用 EBX 记住, 我们可以在上一步之前将 ECX 指向内存中的其它地址 当 ECX 被压入栈中后, 将会调用 EBX, 即 pop edi,pop esi,retn, 这之所以重要是因为它将从栈中弹出一个数值给 EDI 我们无需关注 EDI, 但需要移除栈中 的一个地址, 以便更改弹给 ESI 的值, 第二条指令 POP ESI 将会把 EBX 的值 POP 给 ESI 执行后,EBP 和 ESI 就指向了可写的内存地址, 如图 11 所示 图 11 由上可知 EBP 正是原始 ESP 的值 ( 入口 ), 其中 ESI 指向的正是 ECX 的内存地址 接下来我们调用 ZwSetInformationProcess 去禁止 DEP, 这个地址位于 0x7c83f517, 如图 12 所示 图 12 我们先查看 EBP 地址是否为可写, 若是, 则设置合适的参数供 ZwSetInformationProcess 调用 一旦执行到这里, 将会起到一定作用, 接着检查一下 ESI, 如图 13 所示

图 13 ESI 为可写地址,pop esi 之后,EBP 的值被赋予 ESP 并返回 我们只需找出 shellcode 被加载的地址, 然后设置一个地址去执行 JMP ESP 几分钟后, 结果如图 14 所示 注意, EIP 指向 FFFFFFFF 这是一个无效地址, 查看堆栈情况, 如图 15 所示 图 14 图 15 很明显, 第五个地址正指向了我们所控制的堆栈 由于 ZwSetInformaationProcess 执行一些 push pop 及其它操作, 而遗留下一些垃圾在栈中, 以致无法进入 shellcode 既然无法控制这些地址, 那么我们可以控制它前面的地址 如果我们返回到一个被 忽视 的前方地址, 那么它就可以带领我们到达正确的内存地址, 就可以进入栈中执行 shellcode 回头查看之前的代码 : #0x7c93c899 @SHELL32 PUSH ESP,POP EBP,RETN0x4 disablenx='\x99\xc8\x93\xx7c' #Get EBP close to our controlled stack #POP EBX,RETN 0x7c806b03 @NTDLL disablenx+='\x03\x6b\x80\x7c' #0x7c8043a3 will be EBX when POP

第一条指令中的 RETN0x4 执行后, 将会返回到下一条指令中的 POP EBX,RETN, 但省略了后面的 4 个字符, 我们可以用 \xff\xff\xff\xff 来填充, 以替换即将修改寄存器值的地址 将指令合在一起即为 : disablenx='\x99\xc8\x93\xx7c' #Get EBP close to our controlled stack disablenx+='\x03\x6b\x80\x7c' # 0x7c8043a3 will be EBX when POP disablen+='\xff\xff\xff\xff' #JUNK 系统将先进入地址 0x7c93c899, 然后 0x7c8043a3, 接着忽略 FFFFFFFF, 并继续 执行下去 这里是否可能在 DEP 被禁止后, 我们就返回到 FFFFFFFF 去修改 ESP 并从栈中 POP 一些数据, 从而进入我们的 shellcode 呢? 请看下面的操作 当执行到下面的指令 : #PUSH ECX,CALL EBX 0x7c934f57 @SHELL32 disablenx+='\x57\x4f\x93\x7c' #This will go to EBX(0x7c8043a3) 这条指令将 ECX 压入栈中, 调用 EBX, 接着 POP 给 ESI 一个可写的内存地址 之后, 将会直接调用 ZwSetInformationProcess 函数去禁止 DEP 但我们并未跳转到 ZwSetInformationProcess, 而是执行 RETN0x10, 接着再进入 ZwSetInformationProcess 看下面的指令 : #RETN0x10 @SHELL32 #disablenx+='\x95\x74\x8f\x7c' #Stack Alignment 这将先执行 RETN10 指令 当我们一调用 ZwSetInformationProcess, 它就开始变 戏法了, 先去检测 EBP, 再检测 ESI, 然后 LEAVE, 最后 RETN 0x4 现在在我们执行过

的原始指令之后还有其它一些指令, 就是我们的 \xff\xff\xff\xff 我们可以用 NTDLL 中的内存地址 0x7c85e6f7 替换 \xff\xff\xff\xff, 地址 0x7c85e6f7 的内容如图 16 所示 图 16 给 ESP 加上 20,POP 两个寄存器, 然后 RETN4, 这将直接跳转到我们控制的堆栈中, 即 shellcode 所在的地址 最后一个问题, 相对简单, 也就是精确地查找出可实现 JMP/CALL ESP 的内存地址 这个可以使用 Metasploit, 进入 tools 部分, 然后利用 pattern_create 和 pattern_offset 找出正确的地址 ( 译注 : 除了运用以上工具之外, 还可以利用 OD 来查 找指令 JMP/CALL ESP 的地址, 之前亦曾有人开发过一个插件 OllyUni, 用它可以轻易的 获得整个进程空间中的各类跳转地址, 当然读者也可自己写个 OD 脚本来实现以上功能 ) 使用它即可找到 JMP ESP 的地址, 如图 17 所示 一旦跳到这里, 就可以看到如图 18 所 示的情况 图 17

图 18 现在就进入了我们想要到达的地址, 来到 NOP slide, 最后到达 shellcode 我修改了 SLMAIL 中的 shellcode, 使其可以添加一个用户名 rel1k 另外发现 0xff 0x00 和 0x0a 均为受限字符 让我们来看看它执行前后的情况, 如图 19 所示 注意用户账号, 接着发送 payload, 如图 20 所示 payload 发送后, 重新查看用户账号情况, 如图 21 所示一本地管理员账号 rel1k 被成功添加了

结论 图 19 图 20 图 21 本文讲述的是一个绕过 DEP 的 exploit 入门例子 我想指出的是, 无论如何这都不能 说是微软的问题, 因为他们选择了允许向后兼容 ( 正如 Skape 和 skywing 的文章所提到的一样 ) 足够有趣的是, 我并没有真正地遇到过上面的情况, 大部分绕过 NX 的 exploit 都已经对 ESI 和 EBP 稍作修改了, 而各寄存器之间有所不同的是它们并未指向有用的地址 ECX 和 ESP 是否为可写的内存地址应该是很普遍的问题, 应该稍作修改以便配合其它 exploits 的工作