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
被树梢之上编辑
,原因: