文章目录
前言
- 本章介绍的ida静态分析和动态分析方法,作为ctf逆向选手应该已经掌握了。而且网上内容很多,所以这里不再详细记述
- 本文将对书中
3.5.2逆向工程初步
中的逆向过程进行详细记录:>
之前图片不知道为啥违规了,换一个
开始逆向
首先试着运行一下目标程序,观察运行结果
所以这个软件类似序列号验证软件,接下来看看要求:
- 按下按钮后,不显示"Okay , for now , mission failed"对话框
- 显示一个MessageBox对话框,上面显示用户输入的字符
- 显示一个对话框,用于告知用户输入的序列号是正确的还是错误的
- 将按钮标题由
Not Reversed
改为-Reversed-
- 使序列号为
pediy
其实看到第二个要求和第三个要求的时候,我觉得有一点难办,因为这需要在程序中添加功能,可能需要自己写代码。。但是查看书中的做法后,发现程序其实已经写好这部分代码了,只是程序跳转到其他位置,导致这些代码没有执行。
查壳,发现是一个32位的exe文件,那么可以使用32位ida分析。
第一步,需要定位关键代码
由于第一个任务是要去除Okay , for now , mission failed
的对话框,所以要先定位相关的代码片段
因为函数比较少,所以可以先分析右侧函数窗口的白色函数
很容易就可以发现,在sub_4C110
函数中有Okay , for now , mission failed
字符串
或者我们也可以打开string窗口,直接搜索对应字符串。由于程序中字符串比较少,可以直接发现Okay , for now , mission failed
字符串的位置
双击对应字符串
再双击132(即上图中黄色的位置),ida自动跳转到下图
之后右键–>Text View
, 就能详细显示汇编语言了
不显示"Okay , for now , mission failed"对话框
书中提供了两种方法:一种方法是直接把0040123B
到00401249
的代码nop掉,另一种方法是将0040123B
处的代码改为jmp,这样程序就不会调用MessageBoxA
函数了。这里我演示一下两种方法
由于理论上ida的操作是不可撤销的, 所以我们需要拍摄快照来记录当前数据库的情况
打开View->Database snapshot manager…
这样就打开了数据库快照的管理界面, 添加快照
第一种方法:直接nop对应代码——使对应代码失效
将光标放在需要nop掉的行上,然后点击Edit ->Patch program->Change byte
输入90 , 点击ok,这行代码就被nop掉了
重复这段操作,直到把所有需要nop的代码都nop掉,下图为修改后的结果
接下来按下Exit ->Ratch program -> Apply patches to input file
注意:这一步可能会有一些坑,这里列出我曾经遇到的坑
- ida里面没有
Apply patches...
的选项:这是因为汉化版有的地方没有汉化好,下英文原版就行了- 按下
Apply patches...
按钮后,出现permission denied
的提示。我是在windows系统上运行ida,并且在属性–>安全中确定了对应目录中有修改权限。解决方法:关闭正在运行的程序,重启ida
第二种方法: 跳过弹出对话框的函数
点击Exit->Patch program-> Assemble
输入 jmp near ptr 0040124Eh
Edit -> Patch program -> Apply… 完成修改
显示用户输入的字符
和书中的操作一样,先查找GetWindowTextA
的使用位置
有两个地方调用了GetWindowText
函数。第二次调用用于弹出Okay , for now , mission failed
对话框 , 第一次调用有点可疑,点进去看看
00401211
处的jmp指令直接把程序跳转到弹出Okay , for now , mission failed
对话框的位置。那么这段代码nop掉,程序就能执行接下来的代码了。
修改结果如下
告知用户输入的序列号是正确的还是错误的
打开Winhex,更改相应字符串
修改完成后点击save
修改结果如下
完成序列号验证
先看一下原程序的验证方式
原程序看起来只是简单判断输入的内容有没有在0~9之间,那么按照书中的方式改掉它
好了,到此为止这个程序就被我们逆向完了。
顺便介绍一下跳转语句的使用: 跳转的目标地址 = 跳转语句所占的字节数 + 偏移量+ 跳转语句所处地址
举个例子:修改后00401273处的机器码为75 58
75代表jnz ,53是偏移量 , 75 58 代表整个jnz语句,长度为2个字节
所以跳转地址为 00401273 + 2 + 58 = 4012CD (注意是十六进制)
本文结束
后记
这几天在打2023i春秋的比赛,逆向一道题目都做不出来:(
深深感受到了自己的弱智
接下来可能会更新一些比赛的wp,当然前提是我做出来了