一个简单虚拟机逆向教程

一个简单虚拟机逆向教程

ID:6103531

大小:198.76 KB

页数:10页

时间:2018-01-02

一个简单虚拟机逆向教程_第1页
一个简单虚拟机逆向教程_第2页
一个简单虚拟机逆向教程_第3页
一个简单虚拟机逆向教程_第4页
一个简单虚拟机逆向教程_第5页
资源描述:

《一个简单虚拟机逆向教程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、逆向一个简单的虚拟机-教程Reverser:Maximus获得指令和寄存器好,今晚太累了,我下载了很多我喜欢的好歌,该是逆向的时间了。我听人谈起HyperUnpackMe2这个crackme很多次,于是我找到了它。我打开了我的IDA4.3-是的,我不用破解的那个…工具而已,只是给那些如果没有就什么都做不了的…我打开了这个crakeme。它使用了很多丑陋的反IDA的技巧,这需要很多时间使用U快捷键去取消“跳转/函数调用”的指针,然后使用C快捷键,重新定义代码。它隐藏了LoadLibrary和字符串的指针如“VirtualAl

2、loc”。好了,可笑但并不有趣,我要开始看这个虚拟机了。希望它没有加密,否则我不得不使用OLLY解压脱壳直到虚拟机在代码中呈现出来。那么,我们如何使用IDA4.3在代码中找到一个虚拟机呢?很简单:使用你的滚动条和最古老有效的逆向工具:第六感。我们到底该找些什么呢?我们的“灵感”点在哪里呢?当我浏览aspr1.2dll的时候,我发现在Push序列之后的RET就是关键所在-它确实是,那么虚拟机呢?一个虚拟机由一个指令仿真器构成,它通常是一个公共的代码循环跳转到一系列函数和地址。在本例中,我们查找指针/函数列表。是的,这种列表可

3、能是别的东西,例如,对象(objects)也是这样放置的。我们如何把他们和虚拟机区别开来,或是如果是一个使用高级语言带有对象的虚拟机呢?答案很简单,查看这些过程,需找重复的代码格式。例如,如果它们使用相同的参数,并且这些相同的参数在多个使用它的函数中使用同样的格式,那它可能就是一个虚拟机。就我个人而言,我总是试着找共有的攻击点,如程序计数器(等效EIP)。这并不总是简单的事。如像*F(译者加:可能是一种虚拟机)的bindedflow虚拟机通常就非常复杂(顺便说一下,你可以使用很多方法来记录)。让我们回到这个crackme,

4、滚动屏幕,寻找并跟随那些随机跳转和过程,我们发现一个有趣的列表,就像下面这样。wwPDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com它看上去是不是有点意思,一个堆满指针的大表。我们查看一下这些多级指针(第一张表的链接指向第二张表的头部)的其中一个。IDA给出了如上一堆数据,当我们使用C键把它们标记为代码后,就会变成:wwPDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com有趣吧!在一个异或操作紧跟着

5、一个跳转,我们在所有的这些地方使用快捷键,然后再看看发生了什么。。。这些是我最初使用C的位置。查看一下代码,所有的片段都跳到相同的地址,这似乎意味着所有的片段都有一个相同的收场。注意它们的第一条指令:在所有的入口均使用了movecx,esi这个指令!这不正是相同的格式片段吗-或许相同的逻辑参数被送入esi中?很明显,这是在下一条移位指令中是使用的移位计数,一个SHL。在这些的代码片段中,它们使用[edi]寄存器来保存结果。这三个代码片段都是相同的结构,只是改变了核心指令存储参照:字节指针,字指针,双字指针。这就是虚拟移位指

6、令的三种方式。太好了!我们已经知道了在这里SHL的源操作数被传递给esi,目的地址是edi,并且我们找出了字节移位、字移位、双字移位这几个移位指令。我们很幸运,通常虚拟机的指令结构要比这复杂。这个虚拟机没有应用那些复杂的技术如指令内不同种类的寄存器/存储器/偏移参考等,它似乎在指令中使用了一个固定的源/目的地址:ESI是常规的源头指针,EDI是常规的目的结果指针(我们逆向更多后我们可以看出,通用寄存器通过内存参考传递给虚拟指令-例如,如果SHL目标是一个通用寄存器R1,edi将包含R1的指针)。虚拟机的一个通常的非常标准的

7、攻击点是等效的NOP指令,你如何能发现它们?简单。它们除了更新虚拟机的内部状态之外,什么都不做。因此,一个只是更新似乎是被用来作为程序计数器的寄存器极有可能就是我们这个虚拟机的NOP指令。然而这个crackme的虚拟机非常简洁,因此我们直接去识别那些复杂指令。现在,是我们逆向所有指令并重命名它们的时候了。结果就像下面这样:wwPDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com所有这些指令都与SHL指令非常相似(或多或少)。你会注意到,IDIV指令有点特别,它被

8、分为IDIV和IDIV_REST两条指令。不知你是否记得,IDIV还要返回余数。如果你仔细看一下这两条指令,你会发现:wwPDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comIDIV在EDI中返回不同的寄存器。你会想-为什么?简单,一个是结果

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。