欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]WIN寻找异常发生代码技巧,高手勿入

[原创]WIN寻找异常发生代码技巧,高手勿入

写一篇寻找异常发生点的小技巧,适合新手,大神忽略。。。
当我们拿到程序时可能在某种情况下发生异常,无论出于什么目的(可能你要挖掘一些可利用漏洞,或者你是在汇编重构某软件),你都需要知道异常发生的现场在哪个地址,对于简单的程序来讲,单步跟踪就可以发现异常点,但是如果是一个庞大的程序,消息循环复杂,线程众多,并不好跟踪,这就需要一点技巧了,分享几个我的技巧吧。
一般方法:关键api下断,如你在点击某个button的时候出现异常,如果这个button是打开某以文件那你可以在openfile下断,等等吧,不多说了,需要你分析一下执行的过程中需要通过哪些系统api,这是一般的思路。
利用SEH方法:利用ntdll的exceptiondispatch函数。
当系统发生能够被SHE捕获的异常时候,系统会首先在内核进行相关的一些处理,如果此异常发生在用户空间,那么异常发生后系统返回到用户空间的第一个位置就是exceptiondispatch,并且内核压入了两个重要的数据结构,含有异常发生的现场,这两个结构是EXCEPTION_RECORD,与CONTEXT,其中EXCEPTION_RECORD中的+C偏移处是异常的发生地址,有些的异常我们能够通过这个值直接找到地址,下图是EXCEPTION_RECORD,

可以看到+c处是异常发生地址,但很多情况下这个地址是不准确的,因为程序很有可能是jmp到了一个不合法地址,而异常发生地址往往显示0x00000000引用不合法指令等等,这就需要另一个小技巧,去栈里找案发现场,那就需要用到CONTEXT了,不贴出这个数据结构了 ,比较大,有用的值是esp偏移是+C4,下面我给出一个例子

这是我系统中exceptiondispatch的地址,在此下断

程序运行后发生异常 ,断在了exceptiondispatch处,此时看上图是栈的状态,esp指向的32fb70是EXCEPTION_RECORD的地址,32fb8c则是CONTEXT的地址,可以看到异常发生地址是0,错误类型c0000005,是一个内存读写非法,明显是程序跳到了0地址处,究竟是怎么发生的呢,我们可以寻找异常发生时的esp,向下追溯案发现场

从CONTEXT中找到esp,然后跳转到esp的地址,32fe58就是异常时候的esp

从esp向下看到一个返回地址,%80这就是当时的异常发生的调用者,因为异常发生后对于栈是不破坏的,跟进去就能找到异常的具体原因了,看看是不是可以利用的或者调一下bug。
跟异常方法技巧很多,我只介绍了我习惯的方法,具体问题还得具体分析,大神不要拍砖啊

上传的附件 QQ图片20140905090647.jpg
1.jpg
2.jpg
3.jpg
4.jpg

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功