吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 46657|回复: 108
收起左侧

[漏洞分析] safeseh+dep保护绕过

  [复制链接]
h_one 发表于 2014-3-4 14:40
【文章作者】       :h_one
【漏洞程序名称】:mplayer.exe
【漏洞类型】       :缓冲区溢出
【保护方式】       :safeseh+dep
【操作平台】       : xp sp3
【工具】              :windbg, immunity Debugger,mona等
ps:这个程序是前两年xx比赛的题目,肯定有朋友玩过了,要求是利用seh进行漏洞利用,同时开启dep保护。我想,那时我应该在玩泥巴,不知道啥叫crack,fuzz,漏洞挖掘利用等。挖掘利用此漏洞的首先了解windows的safeseh,dep保护,以及知道怎么绕过。还有在模糊测试时,要根据程序本身处理哪类文件,进而触发漏洞。在程序比较大功能比较多时,这真的就是体力活了,可是首先使用IDA静态分析,看一下目标地址是否为栈分配,源数据是否可控,然后锁定那个调用(堆栈回朔看前面函数处理),分析源数据是从哪里来的。这些杂七杂八的是个人对漏洞挖掘的理解吧.......下面进入本文正题

此次是在xp sp3下操作的,而xp sp3默认dep是关闭的,首先我们的开启dep保护
20.jpg
第一步:Fuzz,触发漏洞
此软件为音乐播放器,处理的数据一般的都.mp3 ,m3u,皮肤 文件。方法:体力+耐力+运气   不知道大家有没有什么好的方法能比较快的触发漏洞
首先利用immunity Debugger调试发现:程序在打开m3u文件时,会将m3u文件所在路径与数据一起拷贝,我是将测试文件放在桌面的。 19.png
利用msf创建m3u后缀的fuzz数据 发现在6k大小是 程序发生异常
1.png


第二步利用no-safeSeh模块地址覆盖seh,绕过safesef,并返回到准备的数据缓冲区
接下来用windbg附加看看
2.jpg

发生了异常从上图看msvcrt!strcat+81:av异常
此时看看异常链情况

执行!exchain
3.png
异常链已被准备的数据覆盖,噢,,,,那么接下来可以利用覆盖seh得到程序控制权.
计算seh偏移
4.png

接下来用py写简单的脚本,junks 用0x90填充 方便后面修改
在5115出写上esh,由于是在xp sp3下对seh的攻击肯定是存在safeseh保护的,因此接下来要绕过safeseh保护。
safeseh绕过方法:
利用SafeSEH保护模块之外的地址
对于目前的大部分windows操作系统,其系统模块都受SafeSEH保护,可以选用未开启SafeSEH保护的模块来利用,比如漏洞软件本身自带的 dll文件,这个可以借助OD插件SafeSEH来查看进程中各模块是否开启SafeSEH保护。除此之外,也可通过直接覆盖返回地址 (jmp/call esp)来利用。另一种方法,如果esp +8 指向EXCEPTION_REGISTRATION 结构,那么你仍然可以寻找一个 pop/pop/ret指令组合(在加载模块的地址范围之外的空间),也可以正常工作。但如果你在程序的加载模块中找不到pop/pop/ret 指令, 你可以观察下esp/ebp,查看下这些寄存器距离nseh 的偏移,接下来就是查找这样的指令:


call dword ptr[esp+nn] / jmp dword ptr[esp+nn]
call dword ptr[ebp+nn] / jmp dword ptr[ebp+nn]
call dword ptr[ebp-nn] / jmp dword ptr[ebp-nn]
(其中的nn 就是寄存器的值到nseh 的偏移,偏移nn可能是: esp+8, esp+14, esp+1c, esp+2c, esp+44, esp+50, ebp+0c, ebp+24, ebp+30, ebp-04, ebp-0c, ebp-18)。


很幸运的可以发现软件本身自带的dll没有safeseh保护,找了一条pop pop retn= 0x6D7C4637
典型safeseh保护攻击模型
• 在nseh 上放置向后的跳转指令(跳转7 字节:jmp 0xfffffff9);
• 向后跳转足够长的地址以存放shellcode,并借此执行至shellcode;
• 把shellcode 放在用于覆盖异常处理结构的指令地址之前。

["\x90"*5115] + [nseh] + [seh] + "\x90\x90\x90\xcc"      
seh = 0x6D7C4637

(ps:附件poc 可以关闭dep, 绕过safeseh,经行漏洞利用)



可是本题的要求是开启dep保护,利用seh进行漏洞利用。我这种小菜还是第一次遇到这么情况,到此遇到屏障.
想了好几天。怎么同时绕过safeseh,dep保护,怎么让数程序可控,指向shellcode?

第三步利用no-safeseh模块内的add esp num; retn(num > 0x909)绕过
no-safeseh
.......................................................................................................................................................................................................................................
覆盖超长字符找到seh地址 将其修改为加载模块之外地址,并下断点 shift+f9 查看异常处理时寄存器与堆栈情况
5.jpg 6.jpg

esp = 0x22E2DC
ebp = 0x22E2FC
看下我们输入的数据离此时esp多远
7.png

ForEsp: 0x22EBE5 - 0x22E2DC = 0x909
ForEbp: 0x22EBE5 - 0x22E2FC = 0x8E9
计算可了解到此时esp到我们准备数据至少位0x909,那么可以寻找指令add esp num (num >= 0x909) retn 这样程序就又可控了。
ADD ESP,xxxxxxxx的机器码:81 C4 xx xx xx xx
利用windbg搜索81 C4指令
s a 0x00000000 L?7fffffff 伳   (搜索 add esp XX XX XX XX)
8.png
选择0x64998c87   (add esp 0x96c) 修改seh为0x64998c87,再此进行调试观察堆栈情况 9.png

覆盖seh之后 执行到0x64998C87观察堆栈情况 成功进入堆栈
ESP已经指向我们的缓冲区了,下面看看ESP指向的地址相对RETN的偏移量,如图所示:
21.png

我们的缓冲区起始于0x22EBE5 ,而现在esp指向0x22EC5C,这里经行简单的计算:
0x22EC5C-0x22EBE5 = 0x77(119)大概是这么多吧,这里可以直接在直接窗口里修改,然后二进制拷贝到winhex

呵呵,算是甩开safeseh了,这要进入我们准备的数据区,只要关闭dep跳入shellcode就算是胜利了。
现在构造的数据模型应该是:my buffer = “\x90” * 119+ “Close_dep” + “\x90” x (5115 – 119) +“\x2C\x0E\x0A\x6D” +“\x90” *nums;
(ps:)


第四步关闭dep,指向shellcode
dep:
数据执行保护,算是目前windows上最强保护了
绕过方法:
1.ret2lib
其思路为:将返回地址指向lib库中的代码,而不直接跳转到shellcode 去执行,进而实现恶意代码的运行。可以在库中找到一段执行系统命令的代 码,比如system()函数,用它的地址覆盖返回地址,此时即使NX/XD 禁止在堆栈上执行代码,但库中的代码依然是可以执行的。函数 system()可通过运行环境来执行其它程序,例如启动Shell等等。另外,还可以通过VirtualProtect函数来修改恶意代码所在内存页面 的执行权限,然后再将控制转移到恶意代码,其堆栈布局如下所示:
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓      
┃                        ┃            恶意代码              ┃内存高地址
┃                        ┣━━━━━━━━━━━━━━━━━┫┃
┃                        ┃        lpflOldProtect            ┃┃
┃                        ┣━━━━━━━━━━━━━━━━━┫┃
┃                        ┃          flNewProtect            ┃┃栈
┃       调用参数         ┣━━━━━━━━━━━━━━━━━┫┃
┃                        ┃             dwSize               ┃┃生
┃                        ┣━━━━━━━━━━━━━━━━━┫┃
┃                        ┃            lpAddress             ┃┃长
┃                        ┣━━━━━━━━━━━━━━━━━┫┃
┃                        ┃      恶意代码的入口地址          ┃┃方
┣━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫┃
┃      返回地址          ┃    VirtualProtect函数地址        ┃┃向
┣━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫┃
┃ EBP上层函数堆栈基址    ┃                                  ┃┃
┣━━━━━━━━━━━━┫                                  ┃┃
┃ 异常例程入口地址(若有 ┃     填充数据的覆盖区域          ┃┃
┃设置的话,比如try…catch)┃       (AAAAAAAA……)           ┃┃
┣━━━━━━━━━━━━┫                                  ┃▼
┃      局部变量          ┃                                  ┃内存低地址
┗━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━┛


本问绕过方法使用关闭dep
此方法的主要原理就是利用NtSetInformationProcess()函数来设置 KPROCESS 结构中的相关标志位,进而关闭DEP
具体实现思路
1.将al设置为1,比如指令mov al,1 / ret,然后用该指令地址覆盖返回地址:
利用OllyFindAddr插件可以找到绕过dep的指令地址
mov al 0x1 rent 地址:0x7c80c190
11.png
观察寄存器情况 堆栈情况 下图
12.png 13.jpg

发现ebp被修改为0x90909090
2.
接下来的工作就是修正ebp可写,与增大esp(具体为什么oday讲的很清楚)注意堆栈的情况。利用OllFindAddr插件找到
push esp pop ebp retn4 地址:0x77ECE353
retn 0x24  地址:0x7D759FFD
修改此时栈中数据。继续跟踪,注意堆栈变化

14.png


此时esp = 0x0022EC68 ,


好了此时我们就可以去关闭DEP了
3.
修改0x22EC68处值为0x7C93CD24
16.png
je比较成功,之后调用ZwSetInformationProcess关闭DEP,    这一步好似干掉了元老吸血鬼。接下来在布置下堆栈就可以上shellcode了。
在0x7C93CD6f处下断 ,显现此时esp = 0x22EC64 ,后面的数据有部分已经被破坏,还好从0x22ECD0后面有一大片数据没有被破坏.......
执行完0x7C93CD6f retn 4后, esp = 0x22EC6C,  0x22EC6C对应数据窗户写入反汇编指令jmp 0x22ECD0,这样就会跳入shellcode
junks+mov_eax+rev_ebp+add_sep+jmp_esp+close_dep+jmp_shellcode+nops + shellcode+nopsh+seh_add_esp)
最后构造的数据模型:(可能会有不同在实际调试时修改)
     junks mov al ,1; retn; push esp pop ebp retn 0x4     retn 0x24  jmp esp   close_depjmp_shellcode nop1s shellcode nop2s add esp
0x96C;pop;pop;pop;retn;
"\x90"*0x73 "\x90\xc1\x80\x7c" "\xE5\xE0\x72\x7D" "\xfd\x9f\x75\x7d""\xb4\xc1\xc5\x7d" "\x24\xcd\x93\x7c" "\xeb\x22\x90\x90" "\x90" * 0x85 "\x......\x" "\x90"*num"\x7D\x8c\x99\x64"


17.jpg 18.jpg 到此成功绕过

后来看到泉哥的文章才知道其实还有可以直接利用seh绕过dep
启用DEP后,就不能使用pop pop ret地址了,而应采用pop reg/pop reg/pop esp/ret 指令的地址,指令 pop esp 可以改变堆栈指针,ret将执行流转移到nseh 中的地址上(用关闭NX 例程的地址覆盖nseh,用指向pop/pop /pop esp/ret 指令的指针覆盖异常处理器)。链接:http://www.blogbus.com/riusksk-logs/80935313.html

在此感谢riusksk补脑,ts的提点

程序+Poc上传到云盘:http://pan.baidu.com/s/1mgI5mPU

11.png
10.png

点评

我C。。。膜拜之。。。好深奥。  发表于 2014-3-4 15:49

免费评分

参与人数 8热心值 +8 收起 理由
lingyulingyu + 1 谢谢@Thanks!
zy2587573qq + 1 我很赞同!
jacky520510 + 1 太高深,看不懂。但还是强烈支持
火钳嘎子 + 1 太深奥了 ,能有简单的教程出来就好了
fire8223069 + 1 谢谢@Thanks!
blmk + 1 膜拜大牛
混小子 + 1 膜拜大牛
吾爱靓仔 + 1 膜拜精华大牛,前排留名求罩,(*^__^*) 嘻.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| h_one 发表于 2014-4-23 12:52

哈哈,恢复是美德
tony2526 发表于 2014-4-21 09:34
bupt_360_wdb 发表于 2014-4-17 21:11
 楼主| h_one 发表于 2014-3-4 15:33
九零-鑫鑫 发表于 2014-3-4 15:16
又长见识了 支持大牛

,,,,,,被和谐了
头像被屏蔽
892644330 发表于 2014-3-4 14:45
大牛神作 看不懂的路过。。
 楼主| h_one 发表于 2014-3-4 14:47
{:1_930:}希望能够交流学习{:1_914:}
Hmily 发表于 2014-3-4 15:08
帖子内涉及QQ群部分内容被和谐了,不符合论坛规定,帖子写的很好,加精鼓励,期待更多作品。
JoyChou 发表于 2014-3-4 15:15
marik下
九零-鑫鑫 发表于 2014-3-4 15:16
又长见识了 支持大牛
 楼主| h_one 发表于 2014-3-4 15:20
Hmily 发表于 2014-3-4 15:08
帖子内涉及QQ群部分内容被和谐了,不符合论坛规定,帖子写的很好,加精鼓励,期待更多作品。

唔老大,,,是交流学习的群也不可以么?

点评

抱歉,论坛版规禁止留QQ和QQ群等联系方式。  发表于 2014-3-4 15:36
 楼主| h_one 发表于 2014-3-4 15:21
892644330 发表于 2014-3-4 14:45
大牛神作 看不懂的路过。。

希望进行交流学习

点评

大牛你太谦虚了 小弟只能膜拜了。。  发表于 2014-3-4 15:51
 楼主| h_one 发表于 2014-3-4 15:27

jc  打屁屁
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-17 01:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表