脱壳小试

前言

关于IDA的中文教程确实少,没有实例甚至讲解,都是自己琢磨的

本文是我按照网上其他人写的用ollydbg脱壳思路,这里尝试使用ida pro进行脱壳,该crackme在其他地方并没有脱壳教程

crackMe

前面有一节的TBM crackMe 逆向 是直接跳过脱壳部分,这一节补一下

ESP定律

ESP定律就是利用堆栈平衡的原理,迅速找到OEP(真实的程序入口)

通常的壳会把一些真实程序运行的资源进行压缩,等到压缩程序运行起来的时候,先进行解压,再跳到OEP的继续运行真实程序

在解压之前需要把当前环境进行保存,例如寄存器esp,那么在此下硬件断点,当压缩程序尝试恢复该寄存器值时,必然会去访问该保存,此时就能被前面的断点断住

环境

win10

ida pro Version 6.8.150423 (64-bit)

crackMe TBM

scylla x64 v0.9.7c

PEID V0.95.EXE(可选)

步骤

1

首先把TBM拖入IDA,查看function-view只有一个函数start,可见IAT为空

双击进入查看start,发现start函数上面有一个db 60h

游标放上去,使用快捷键c强制解析成指令

可见pusha,这个指令就是把寄存器都进行保存了

那么在0x00405001处按F2下断点,F9进行调试

在内存观察窗口Hex View右键Synchronize with RSP,在该内存处进行硬件断点

(注意此时不能使用F2添加断点,因为在Hex View窗口里F2是修改数据)

Debugger -> BreakPoints -> AddBreakPoints

弹出窗口中,输入地址,勾选Hardware

2

下完上述硬件断点后,按下F9运行,随后触发,如下图所示

注意上面的db 61h,依然使用强制解析得到popa,与上述的pusha对应

3.OEP

继续F8单步调试几下,很快就到了下图所示

seg017:004011D1 push    ebp  
seg017:004011D2 mov     ebp, esp  

典型的程序入口痕迹

4.dump

这时候,需要把内存中的各个有用的保存(dump)下来

ctrl-s快捷键召唤出段的列表

看到需要有用的段地址区间0x400000 ~ 0x407000 包括crackme6.exe、seg017、seg018等段

使用如下脚本File -> srcript file -> dumpScript.idc

//dumpScript.idc
static main(void)  
{
    auto fp, begin, end, dexbyte;
    fp = fopen("dump.exe", "wb");
    begin = 0x400000;
    end = 0x407000;
    for ( dexbyte = begin; dexbyte < end;dexbyte++ )
    {
        fputc(Byte(dexbyte), fp);
    }
}

生成的文件dump.exe

5.转存修正

peeditor 打开上面的dump.exe,选择节区

对每一个节区(段),都进行 右键选择转存修正 操作

6

这时候先运行一下crackme,然后打开syclla尝试附加这个crackme

但是如果系统进程数太多,在附加列表中可能找不到这个crackme进程,需要手动关一下其他进程

下图所示

1.选择进程

2.填入上面得到的OEP地址,004011D1

3.点击IAT搜索

4.获取输入表

5.修复转储,选择上面的dump.exe文件

生成的dump_SCY.exe就是脱壳之后原程序

参考

逆向脱壳附加数据处理

逆向破解程序脱壳篇-压缩壳