在CTF中常遇到一些壳,影响分析。常见的简易壳有UPX
,ASPACK
至于vmp
,对于新手算是极其不友好了,听大佬们说3.0版本以下的vmp比较简单,我一个菜鸡听着只有一个想法:mad你说话好伤人啊 = =
当然,这篇文章应该算是记录一些常用的脱壳办法。
- 单步分析法
- 双断点分析法
- ESP分析法(大名鼎鼎 ESP定律)
- 异常分析法
- SPX分析法(OD的功能,挺鸡肋,不介绍了)
- ……
原理
找到 OEP,只需要找到程序入口点,使用一些alloc工具Dump即可。
单步分析法
- OD载入
- 不断单步向下(F8),让程序指令向下运行
- 遇到程序往回跳的(包括循环),在下一句代码处按F4(右健单击代码,选择断点——运行到所选)
- 判断方法
- 如果刚载入程序,在附近就有一个
CALL
的,我们就F7跟进去,这样很快能找到程序的OEP - 如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
- 一般有很大的跳转,比如
jmp XXXXXX
或者JE XXXXXX
或者有RETE
的一般很快能找到OEP。
- 如果刚载入程序,在附近就有一个
双断点分析法
- OD载入
- 选项——调试选项——异常,把里面的忽略全部√上,CTRL+F2重载程序
- 按ALT+M,DA 打开
Memory Map
,找到第一个.rsrc
区段,按F2下断点 - Shift + F9运行到断点
- Alt + M,打开
Memory Map
,找到.code
区段,按F2下断点 - Shift +F9,到达OEP
ESP分析法
- OD载入
- 单步步入F8,寄存器窗口中ESP标红
- 在命令行下:
- dd 00xxxxx(指在当前代码中的ESP地址,回车
- 右键——数据窗口中跟随
- 随便选取几个字节,下硬件断点(类型都可)
- F9运行到断下
- F8,到达OEP
异常分析法
- OD载入
- 选项——调试选项——异常,把里面的√全部去掉,CTRL+F2重载
- 在开头跳转处Shift + F9,记下从开始按F9到程序 运行的次数
n
,直到程序正常运行 - Ctrl + F2重载,
n-1
次 Shift + F9 - 右下角的ESP堆栈选中 SE 句柄
- Ctrl+G,跳转到SE 句柄对应地址
- F2下断点,Shift + F9 断下
- 去掉断点,F8向下走
- 到达OEP
后话
对于CTF而言,大多考察算法,也就是静态分析的能力,一般不需要修复让其正常运行。但在某些情况下,需要动态分析,那么修复就是必要的了。
发表回复