写一篇寻找异常发生点的小技巧,适合新手,大神忽略。。。 当我们拿到程序时可能在某种情况下发生异常,无论出于什么目的(可能你要挖掘一些可利用漏洞,或者你是在汇编重构某软件),你都需要知道异常发生的现场在哪个地址,对于简单的程序来讲,单步跟踪就可以发现异常点,但是如果是一个庞大的程序,消息循环复杂,线程众多,并不好跟踪,这就需要一点技巧了,分享几个我的技巧吧。 一般方法:关键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。 跟异常方法技巧很多,我只介绍了我习惯的方法,具体问题还得具体分析,大神不要拍砖啊
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!