目标程序
程序下载:CRACKME
解压密码:9unk
任务目标:通过 IDA 学习分析程序并进行打补丁
分析步骤
- 自动加载分析程序
打开 Programe Segmentation 窗口显示程序的段列表
一个程序的应该是从 0x400000 的 Header 区块开始,但是这里并没有显示加载 Header 区块,这是因为 IDA 在加载程序的过程中,它只加载除了 header 区块以外的可执行部分。
Programe Segmentation 窗口(需要关注的列)
1 | NAME:各区块的名称 |
- 手动加载程序
手动定位基地址
确认代码区域的基地址是否在 0x401000,选择 “yes”。后面全都默认选择 yes
再次进入Programe Segmentation 窗口可以看到所有的区块(这些操作都不是必要的,但还是需要了解一下)
- 创建快照
由于 IDA 不提供撤销功能,如果不小心按错了某个键,导致 IDA 数据库发生了改变,就得重新来过,所以要记得操作的时候创建快照。快捷键:Ctrl+Shift+W(可根据情况设置快照描述信息)
- 管理快照
当我们需要恢复、重命名、删除快照时可使用管理快照的功能。快捷键:Ctrl+Shft+T
- 程序分析
查看程序的关键信息
打开 String 窗口,搜索字符串
双击,在 0x402169 定位到关键信息的位置
在该地址上按 D,将字符串转化成十六进制数据。
在该地址按 A,将十六进制数据恢复成字符串
左击该地址或者标号并按下 X,查看程序在哪边调用了这个错误字符串。
从上面看这个字符串被两个函数调用。一个是 sub_401362 和 sub_40137E。第一列的描述信息是 “UP” 说明这两个函数的位置在该地址之前。
我们双击第一个函数,查看这个函数的代码
可以看到这是一个调用 MessageBox API弹出错误消息框的函数
我们用快捷键 “N”,将这个函数重命名为 “CALL_ERROR”
我们继续按 X,看看这个错误函数在哪里被调用了
按 “空格” 进入图形模式,查看此时程序的运行逻辑
可以看到,运行错误就会执行 CALL_ERROR 函数,正确就会执行 loc_40124C 这个函数
我们先修改 CALL_ERROR 函数的背景颜色,这样使分析更加快速方便
我们继续分析 loc_40124C 中的 sub_40134D 函数
从上图中可以看到这是一个正确的消息弹窗,我们继续修改函数名称为 CALL_GOOD
双击 WndProc 函数,回到原来的视图,并把正确的函数做好背景标记
我们继续看一下上一个函数的 JZ 跳转指令
我们左击到 JZ 跳转指令处,使用快捷键 Ctrl+Alt+K(打补丁功能) 把 JZ 指令,修改成 JNZ 指令。
最后对打补丁后的程序进行保存
我们输入任意用户名和密码,可以看到程序已经打补丁成功
后面我们还需要修补另一个报错信息
我们经过一些分析,可以看到这是判断输入的用户名是否有数字,如果有数字就会跳转报错。
我们这里将 JB 指令,改成空指令 NOP,来忽略这个跳转。
最后再对程序打补丁,验证。
reference
翻译自:8-REVERSING WITH IDA PRO FROM SCRATCH [Ricardo Narvaja]
- 本文标题:从零开始IDA-crackme分析
- 本文作者:9unk
- 创建时间:2021-02-24 18:26:28
- 本文链接:https://9unkk.github.io/2021/02/24/cong-ling-kai-shi-ida-crackme-fen-xi/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!