利用硬件断点快速查找 UPX OEP

Table Of Contents

引言

今天听了Y哥的分享之后很真实地感受到了自己的菜。。。感觉自己真的什么也没有干。借了书也基本只看了几十页就放弃了,完全不知道自己怎么入坑XD。感觉大家都好强啊,看书飞快,学习神速。而我感觉自己拿得出手的只有一点大家都会的C语言了。

硬件断点这个东西一直都有所耳闻但是不知道有什么用,今天通过手拖最简单的upx壳来体会一下硬件断点的独特之处

这里的程序使用了最简单的helloworld程序(这个不重要)

开始

打开程序,EIP的位置在第二段节区的末尾

第一个命令是 pushad,就是将EAX到EDI寄存器的值一次存储到栈中。相对应的有一个popad将栈中的数据依次返还给各个寄存器

执行pushad前各寄存器的值

接下来F8,查看栈中的值

最下面还没有显示全的是函数的返回地址(和pushad无关),上面这几个逆序存放着EAX-EDI的值。值得注意的是,我这个upx压缩后的这个helloword程序在pushad时是将EAX-EDI依次入栈,但是在《逆向工程核心原理》中的示例程序加upx后是依次将EDI-EAX的值入栈。

把这个地址放到HEX窗口中,选择硬件断点中的硬件访问-byte(后面这个无所谓),主要是硬件访问。硬件断点有3种状态,目的是改变内存的权限,访问该内存时暂停,还是在试图写入内存时暂停,还是在试图运行内存中的命令时暂停,个人感觉这个硬件执行的断点跟普通的F2断点没有太大区别。。。

为什么要建立硬件访问断点呢?因为upx壳有一个特点,解压的代码存放于pushad和popad中间,执行完popad之后会jmp到第一段节区的开头。(这个手动调一下就可以发现了)

那么popad时就会涉及到对这段内存(栈)的访问,所以这时候就会触发硬件断点。

我们设完断点之后F9执行,就会停在popad之后

很有意思的是,在设一般断点的时候运行会停止在断点的前面(不执行那个命令),但是硬件断点的时候回停在执行完这个命令之后。这个原因可能是因为在执行popad的时候才会访问到这个内存,所以停止的时候这个命令已经执行完了?

总之我们能看到upx壳的结尾,jmp 004011a1。跳转之后就是 OEP

后记

有时候干这个都不知道自己的意义何在,就像我在上学期用了很久的ollydbg,逆一个程序的主函数调来调去弄不明白,结果试着用了下IDA一下F5就出来了。。。之后的逆向似乎一直都是对C语言的解读。像upx这种特征明显的壳ollydbg倒是能够使用,但是一旦复杂的程序该怎么办呢,是不是还是得会IDA F5?

之前刚开始想学习windows的时候,借了很多书,什么《windows32位环境下汇编。。。》、《windows API。。。》,《Windows PE。。。》,但是每本书都是只看了一点就结束了。最闹心的原因就是自己的环境总是跟书中的不一样,每次按照书中的案例编写了程序,到最后F5的时候出错一大把,有些书的环境是xp 32的,有的是别的。。。主要是visual studio好像也变得不兼容之前的东西了?每次都在这种地方停住,干看又看不懂记不住,想着手试一试又没法试。这可能是上学期我最真实的感受了,寒假的时候光顾着打hgame,玩的都是linux的程序,而且都可以ida f5,所以。。。我也不知道我在干嘛。。。深夜只能在自己的基地发发牢骚,泼一下丧气。希望看到这篇文章的小伙伴们不要被我传染,一起加油吧

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒