《加密与解密》个人阅读笔记 三

前言

  1. 本章介绍的ida静态分析和动态分析方法,作为ctf逆向选手应该已经掌握了。而且网上内容很多,所以这里不再详细记述
  2. 本文将对书中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"对话框

书中提供了两种方法:一种方法是直接把0040123B00401249的代码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

注意:这一步可能会有一些坑,这里列出我曾经遇到的坑

  1. ida里面没有Apply patches...的选项:这是因为汉化版有的地方没有汉化好,下英文原版就行了
  2. 按下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,当然前提是我做出来了

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值