ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

CTF-REVERSE练习之算法分析1

2021-11-29 11:02:53  阅读:199  来源: 互联网

标签:插件 REVERSE 程序 CTF ANALyzer 算法 IDA sub


目录

预备知识

一、相关实验

本实验要求您已经认真学习和完成了《CTF REVERSE练习之API定位》。

二、PEiD密码算法分析插件

不管是在CTF竞赛的REVERSE题目中,还是在实际的商业产品中,很多程序都喜欢使用成熟的标准算法来作为注册算法的一个部分,如MD5、Blowfish等。这些算法本身往往就十分复杂和难以理解,如果从反汇编指令来阅读这些算法则更是难上加难。对于标准算法,实际上我们并不需要知道这些算法的详细计算过程,我们只需要知道是哪一个算法即可,因为标准算法网上都能找到成熟的库文件或者源码等。
PEiD有一个叫做Krypto ANALyzer的插件,使用这个插件可以对程序进行扫描,通过特征匹配来识别程序内部可能用到的一些标准算法。Krypto ANALyzer的使用方法为:点击PEiD主界面右下角的“=>”按钮,选择“插件”菜单项,然后选择“Krypto ANALyzer”,就可以弹出Krypto ANALyzer插件了。Krypto ANALyzer插件会自动分析程序内部可能用到的标准算法,如图所示:
在这里插入图片描述
下图中显示了程序中在地址00401E5C处存在MD5算法的特征:
在这里插入图片描述

三、IDA重命名等功能

在IDA中,我们可以通过按下N键来对一个变量/函数/标记等进行重命名操作,函数和变量命名对于帮主我们理解程序的内部逻辑非常重要,就好比我们在编程的时候,培养良好的编程风格非常重要一样。
比如如果函数sub_4012E0经过我们分析之后,确定其功能为将传入的字符串转为大写形式,那么我们可以选中sub_4012E0后按下N键对其进行重命名(将函数名命名为fnStringToUpper):
在这里插入图片描述
IDA还可以给汇编指令或者伪代码来添加注释。如果要对某一条汇编指令添加注释,只需要在汇编指令所在行按下分号(即;)即可弹出对话框来接收注释;如果要给伪代码添加注释,则只需在伪代码所在行按下斜杠(即/)即可弹出对话框来接收注释。
OD也可以给汇编指令添加注释,只需要在汇编指令所在行后一列的空白处双击鼠标左键即可,如图所示:
在这里插入图片描述

实验目的

1)学会通过PEiD的Krypto ANALyzer插件来识别程序所使用的算法。
2)掌握IDA的基本操作,学会使用IDA进行静态分析。
3)学会编写简单的注册机(Keygen)程序。

实验环境

在这里插入图片描述
服务器:Windows XP,IP地址:随机分配
辅助工具:PEiD,IDA

实验步骤一

题目描述:
主机C:\Reverse\4目录下有一个CrackMe4.exe程序,运行这个程序的时候会提示输入用户名和注册码进行注册,当输入正确的用户名和注册码时,会弹出成功提示的消息框,请对CrackMe4.exe程序进行逆向分析和调试,尝试编写一个注册机程序。
考察意图:
这个CrackMe程序要求输入一个用户名以及注册码进行注册,注册码通过用户名经过一定的算法变换得到,主要考察逆向分析中简单的算法分析过程,其中使用PEiD的Krypto ANALyzer插件可以快速识别程序用到的标准算法。
通过API交叉引用快速定位关键代码:
运行这个程序后要求输入一个用户名和密码进行注册,当注册失败的时候,程序将弹出一个消息框提示不正确,如图所示:
在这里插入图片描述
那么我们可以通过IDA的交叉引用功能来定位这一块的代码。使用IDA载入CrackMe4.exe程序,待分析结束后,通过Imports TAB页面找到MessageBoxA,双击来到反汇编视图,在MessageBoxA按下X按键对其进行交叉引用查找,经过一个一个进行分析,我们发现sub_4016B0就是我们所要找的关键函数,我们通过F5得到这个函数的伪代码。通过对伪代码添加注释,以及对变量进行重命名操作,我们得到如下的代码片段:
在这里插入图片描述
上面的伪代码有两个错误,就是在第一个if语句中会判断密码的长度是否为33,如果不是33就弹出错误提示。其实这里是32(而用户名的长度则不能大于10)只是Hex-Rays Decompiler这个插件生成伪代码时出错了,所以需要记住,F5生成的伪代码并不保证完全正确。32这个长度对应汇编指令中的代码片段如下:
在这里插入图片描述
通过上面的伪代码的分析,我们发现只有sub_401510这个函数的功能并不清楚,通过双击sub_401510查看对应的伪代码,发现有点复杂,暂时无法理解,不过这并不要紧。

实验步骤二

使用PEiD的Krypto ANALyzer识别算法:
如果程序使用了标准算法进行处理,那么可以使用PEiD的Krypto ANALyzer进行快速识别,将CrackMe4.exe载入PEiD,点击PEiD主界面右下角的“=>”按钮,选择“插件”菜单项,然后选择“Krypto ANALyzer”,就可以弹出Krypto ANALyzer插件了,Krypto ANALyzer提示程序使用了MD5算法,如下图所示:
在这里插入图片描述
我们记住00401E5C这个地址,在IDA的反汇编指令视图(IDA View)中按下G键,输入00401E5C,就会自动跳转到计算MD5的函数代码中,如图所示:
在这里插入图片描述
从这里并不能得到什么有用的信息,我们需要通过不断的回溯来理解程序的代码逻辑。通过往上查阅代码,我们知道00401E5C位于函数sub_401D10之中,我们对sub_401D10进行交叉引用查找,如图所示:
在这里插入图片描述
可以从sub_401D10回溯到sub_4026F0,继续通过交叉引用往上回溯,依次为sub_4027B0、sub_401C00、sub_401BB0、sub_401510,而sub_401510就是我们在实验步骤一种为一个暂时不理解的函数。那么我们可以猜测sub_401510这个函数就是用来计算用户名的MD5值的,我们可以通过OD动态调试来验证我们的想法。
通过阅读IDA中的反汇编代码,我们知道在00401752处调用了sub_401510这个函数:

.text:00401752                 call    sub_401510

现在OD载入CrackMe4.exe程序,在00401752处设置一个断点,然后按F9运行程序,用户名输入test,密码输入一个32个字符的任意字符串,单击“注册”按钮,程序便会自动断下,断下后按F8进行单步跟踪,执行sub_401510这个函数后,我们看到eax寄存器的值为098F6BCD4621D373CADE4E832627B4F6,这个恰好就是test的MD5值。
在这里插入图片描述

实验步骤三

编写注册机:
现在我们已经将程序的注册算法分析清楚了,下面就可以编写一个注册机了。程序的注册算法为:将用户名进行MD5计算得到一个哈希值,将哈希值转换为答谢字符串即可,其中用户名的长度在1~10之间,不能超过10。
Python内置了MD5算法,可以非常方便的计算MD5值,我们编写这样一段脚本即可:(代码位于C:\Reverse\4\Keygen.py)

import hashlib
while True:
    username = raw_input("input username:")
    md5 = hashlib.md5(username).hexdigest().upper()
serial = md5[::-1]  # 翻转字符串
print "serial: %s" % serial

我们输入用户名Wins0n,就可以得到注册码为51F561458ADAEEBA43A57CF7E59F6CC4,输入程序可以成功注册,如图所示:
在这里插入图片描述

标签:插件,REVERSE,程序,CTF,ANALyzer,算法,IDA,sub
来源: https://blog.csdn.net/ChuMeng1999/article/details/121604162

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有