首页
社区
课程
招聘
[原创]Easy MPEG to DVD Burner 1.7.11 SEH Local Buffer Overflow
2018-6-16 14:35 5935

[原创]Easy MPEG to DVD Burner 1.7.11 SEH Local Buffer Overflow

2018-6-16 14:35
5935
1.前言
最近在exploitdb找到了一个利用SEH的漏洞实例,(网址是https://www.exploit-db.com/exploits/44565/,软件和脚本都在里面),就想要自己分析分析,加深一下理解。漏洞标题是Easy MPEG to DVD Burner 1.7.11 SEH Local Buffer Overflow,
实验环境是win7sp1,x64,关于这个的漏洞利用有两个,一个是在没有开启DEP情况下的,一个是开启了DEP的。本篇文章介绍一下调试定位过程,以及exploit编写思路,此exploit针对没有开启DEP的系统环境。
2.定位溢出点和利用点
软件是Easy MPEG to DVD Burner 1.7.11 ,exploitdb官网上提供了下载链接,根据漏洞利用信息,“# Steps : Open the APP > click on register > Username field > just paste watever generated from python script in the txt file.”,定位到漏洞发生的模块,也就是输入用户名的地方。

使用OD附加,有时程序卡死,恢复所有线程即可

由exploitdb提供的python脚本生成样本

生成的Evil.txt里面的内容输到用户名(用010editor打开),就会触发漏洞,弹出calc。当然你也可以输入一长串字符,软件就会崩溃。如果只是分析shellcode,就直接在根据漏洞利用信息evil.py,在他设置的seh地址那里下断点就可以了。这里从溢出点分析,在用户名注册码那里输入myuser myreg,弹出错误提示框

点击暂停程序查看调用

定位到Easy_MPE.00406FAD

定位“跳转来自 00406EB0”

简单的看,程序首先UpdateData从控件获取用户名和注册码字符串(注册码在控件输入处就控制了输入最大长度),然后将其分别拷贝到大小为64字节的局部变量中。接着动态加载ehter.dll,调用其中的reg_code函数,由用户名计算出一个字符串,与你输入的注册码进行比较,由结果弹出不同窗口。其中漏洞模块出在拷贝用户名字符串时,没有指定或判断长度,导致了栈溢出。


输入一长串字符串作为用户名(不要过长),发现其会崩溃。

OD调试时发现,其在执行reg_code函数时内部会出现访问异常,而接着当系统调用SEH的时候,会调用到我们的0x42424242,此地址是无效的。

这时候再来看看SEH指针究竟在哪?
在执行完对用户名的拷贝之后,我们溢出的数据开始于
0018A37C   42424242
向下翻,在od中发现
0018A76C   42424242  指向下一个 SEH 记录的指针
0018A770   42424242  SE处理程序
0x0018A770便是我们需要攻击的目标。0x0018A770-0x0018A37C   = 1012,也就是exploit 1012后四个字节应该放着我们特殊构造的seh地址。
3.exploit编写思路
首先,我们可以利用SEH机制劫持eip到我们设置的某个地址去执行特定代码,这个地址必须是可以预测的,那么“DLL have ASLR,safeSEH,rebase off”的SkinMagic.dll就成为了我们的目标。当我们成功的劫持了EIP,接下来需要做的,就是如何跳回原来的栈上执行数据了(注意这里没有开启DEP)。那么首先就应该分析此时的堆栈和寄存器环境,想想如何在SkinMagic.dll找到一段代码让自己能够跳回到溢出的栈上。这里先记录下溢出堆栈的范围0x0018A37C~0x0018A770,接下来分析分析之前生成的Evil.txt。
4.分析exploit

执行完拷贝可以看到 设置了nSEH 和 SEH,在1014AAE处下好断点

10014AAE处的内容为:
10014AAE    5D              pop ebp                                  
10014AAF    5B              pop ebx                                  
10014AB0    C2 0400         retn 0x4
还记得之前的溢出的堆栈的范围吗?0x0018A37C~0x0018A770,下图是刚刚进入SEH处理函数的堆栈和寄存器环境,值得关注的是在0x0018A37C~0x0018A770这个范围内或附近的值

这个eploit选择的是利用00189C44处的0018A76C,0018A76C恰好指向的是nSEH,而要利用00189C44存储的0018A76C,将其作为返回地址,寻找达到esp + 8 ,retn 0x4这种效果的指令就可以。SkinMagic.dll里的pop ebp,pop ebx,retn 0x4就满足要求,如图,马上要跳转到我们的溢出堆栈上了。

这里就可以看到之前设置的nSEH的作用(这里有一点巧合,刚好跳回的地址在nSEH这个地方),EB 0C向下跳转,这样就绕过了SEH值对代码执行的影响,并且向下跳转编写ShellCode也没有大小限制。

之后就是正常的ShellCode的执行了,这里shellcode加密了,因为要避免一些无效字符。
整个ShellCode作用是弹出一个计算器,这里就不再详细分析了。


5.exploit编写总结
nSEH = "\xeb\x0C\x90\x90"  #Jmp short 14 (EB0C),这个作用就是向高地址跳转,跳过SEH。
SEH = "\xae\x4a\x01\x10"   #pop ebp # pop ebx # ret ;伪造的SEH指针,目的是跳回到我们的栈上
nop = "\x90" * 16  
整个exploit的构造:
ExploitData = junk + nSEH + SEH + nop + evil


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2019-4-12 10:19 被树梢之上编辑 ,原因:
收藏
免费 1
打赏
分享
最新回复 (2)
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2018-6-17 22:33
2
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kanxueqwe 2019-9-20 11:02
3
0
请问,为什么在win7 64英文系统测试可以,在中文系统测试就不行的原因,初学者,希望大佬指点一下
游客
登录 | 注册 方可回帖
返回