-
-
一种找漏洞触发位置的思路
-
发表于:
2018-8-28 16:37
5222
-
第一次发帖,不是很会弄格式,附件中有word文档,图片清晰些。
本贴非常的基础,但是对于我这个刚刚弄漏洞的小白来说,还是颇费了一番周折,自认为比较通用,所以发出来给像我这样的新手朋友一点借鉴,大佬直接飘过。
首先确定shellcode的位置,然后找最近一层的堆栈调用,不是用od中的k,是堆栈窗口中的堆栈数据
堆栈覆盖可能覆盖的不止一层,所以看k是没啥用的
然后跟到调用的位置,这时堆栈还没有被覆盖,数据也没有被破坏
一、先确定大概漏洞触发位置,利用od里面的自动步过,只要有跳到shellcode的地方就把那个地方下断点,然后从那个位置继续步过
这样经过几个来回,基本就能确定漏洞触发的大概位置了,然后再来确定是哪一条触发的
二、漏洞触发的现象是某个函数覆盖了堆栈的值,所以思路就是下写入断点
一般在漏洞触发后,堆栈中的数据被设置好了,返回地址也会返回到rop链,观察是哪一层返回地址发生了变化,导入到rop链上了,直接对这个位置下写入断点,然后就可以准确的确定是哪行导致了漏洞触发
测试环境:
xp sp3 专业版+adobe 9.3.0EN
找了个验证poc,漏洞触发会弹出计算器,为了便于调试,手工把随机基址关掉
对winexec下断点,加载pdf,会断下来
此时OD中的K窗口
因为堆栈数据被破坏,所以看到的回溯也是错的
直接看堆栈窗口的数据
缓冲区溢出往往只是破坏某一个或者几个栈帧的返回地址,而不会对整个栈帧破坏,所以查看临近的栈调用是可行的
跟随最近的调用,并下好断点
然后我们重新载入,打开pdf
f9运行之后,会断到20BA8252,利用OD的自动步过(Ctrl+F8),这里如果用自动步入,会走很多函数,很难等到我们要的函数。
我们先大致确定漏洞触发的范围,然后再对关键部分进行步入跟进。
由于在winexec位置还是有断点,自动步过之后会断到那个位置,我们用键盘的减号“-”返回,查看是哪个函数调用跳到winexec上的
找到20BA719E处的调用,跳到目标函数,我们在这个函数调用里面下好断点,然后再次载入,运行之后,F9再次来到我们刚刚下好断点的位置
同样的,当断到winexec时,用减号回放
依然在函数调用里面下好断点,然后重新载入
重复这个过程多次之后,我们可以发现函数的调用越来越深入,甚至连rop链都已经跟出来了
下面这个跳转之后返回,就返回到rop链上了
既然都能跟到rop链(至于rop链的判断完全凭经验,一般都是小零件一样的汇编代码,不是成片的),说明漏洞已经触发,构造好的数据已经被写入到堆栈中了。
下面,我们来找漏洞触发的具体位置
本来这一系列函数地址都是AcroForm模块中的调用,返回地址也是这个模块的,所以我就找到了跳往rop链的地址作为突破口(这里只要是自己确定的数据被修改了都是可以,也可以用没有问题的pdf文件打开作为对比)。
在函数20CB59A0被调用前,返回地址是正常的
调用之后,返回地址被修改为了rop链地址了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!