-
-
[原创]WIN寻找异常发生代码技巧,高手勿入
-
发表于:
2014-7-9 15:20
10570
-
写一篇寻找异常发生点的小技巧,适合新手,大神忽略。。。
当我们拿到程序时可能在某种情况下发生异常,无论出于什么目的(可能你要挖掘一些可利用漏洞,或者你是在汇编重构某软件),你都需要知道异常发生的现场在哪个地址,对于简单的程序来讲,单步跟踪就可以发现异常点,但是如果是一个庞大的程序,消息循环复杂,线程众多,并不好跟踪,这就需要一点技巧了,分享几个我的技巧吧。
一般方法:关键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。
跟异常方法技巧很多,我只介绍了我习惯的方法,具体问题还得具体分析,大神不要拍砖啊
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课