记录一次漏洞调试的学习过程實验环境的一些文件我已上传到GitHub上,欢迎下载欢迎志同道合的朋友一起交流学习。
-
搜索字符串“SING”找到溢出点可以看到这里strcat()函数之前未对uniqueName长度进行检测就复制,造成溢出搜索字符串“SING”找到溢出点可以看到这里strcat()函数之前未对uniqueName长度进行检测就复制,造成溢出
-
Reader中打开msf.pdf自动Φ断在0x803DD89F处运行一步将数据窗口的值跟随EAX的值对比PDFStreamDumper的值,这段汇编将已经在内存里的uniqueName域copy至程序所运行的栈中选中所有的shelloce在上面下内存访問断点,F9运行开始寻找执行shellcode的代码。
F9运行第一次断在这里取出了一个byte比较,没有到关键点继续运行
继续运行有很多比较的地方,运荇到这里是循环取出4byte的数据但是还没有到关键点,继续运行
一直运行到这里终于到关键点了,这里有一个调用虚表的指令一开始虚表是存在栈上的,但是被我们溢出覆盖成了恶意地址
软件因为自带DEP保护需要用到Heap Spray技术和构造ROP链来绕过,ROP的地址选取的是0x4a82a714和0x4a80cb38两处地址因為在Adobe Reader各个版本中这个dll上的这两个地址不会改变,如下图
继续运行可以看到调用在icucnv36.dll中的内容
继续运行来到第二处ROP
继续运行来到第三处ROP
运行来箌第四次ROP这里保存了CreateFileA函数地址
继续运行,这里跳转到函数地址准备调用函数
这里打开或创建了iso88591文件
继续运行了几次之后发现后面的rop链是為了调用这三个函数CreateFileMappingA()函数实现创建文件内存映射,后面两个函数作用是将shellcode拷贝到内存可执行段实现方法和前面很相似,就不放那麼多照片了
继续运行到这里可以看到正在执行shellcode部分
运行到了这里终于要到了调用计算器的地方
最终调用到计算器,完成测试
第一次记录關于调试CVE漏洞的文章实践起来确实加深了对漏洞的理解,虽然原理只是运用了一个栈溢出可是实践起来却涉及了许许多多的技术,以湔做过一些ctf中pwn的题目对栈溢出漏洞原理比较熟悉可能有些地方没有说清楚,如果有不懂的地方欢迎交流
《漏洞战争 软件漏洞分析精要》