[实验吧](逆向工程)该题不简单


描述 :

无语了,想给你们制造点悬念都没有了,哎!直接去做题吧
解题链接: http://ctf5.shiyanbar.com/crack/3/
关键字:
 破解 逆向 调试 
破解[crackme1.zip](http://ctf5.shiyanbar.com/crack/3/CrackMe1.zip)压缩包的程序 
要求:请找出用户名为hello的注册码 

下载并解压题目提供程序
尝试运行程序 :

[实验吧](逆向工程)该题不简单_第1张图片
Paste_Image.png
[实验吧](逆向工程)该题不简单_第2张图片
Paste_Image.png

发现输入错误的时候会有一个 AlertDialog 弹出 , 提示 "密钥无效"

首先使用 bash 的 file 工具查看一下文件类型 :

Paste_Image.png
CrackMe1.exe: PE32 executable (GUI) Intel 80386, for MS Windows

打开 IDA , 载入该程序 , 由于我们之前运行该程序的时候注意到了关键字符串 "密钥无效"
这时可以通过搜索定位 "密钥无效"

[实验吧](逆向工程)该题不简单_第3张图片
Paste_Image.png

双击后面的注释跳转到 图形视图

[实验吧](逆向工程)该题不简单_第4张图片
Paste_Image.png

这里调用了这个函数 : sub_4011D0
当返回值不为 0 的时候 , 就跳转到 密钥无效 的分支
我们继续查看这个函数 : sub_4011D0
直接 f5 反编译为 C代码

[实验吧](逆向工程)该题不简单_第5张图片
Paste_Image.png
[实验吧](逆向工程)该题不简单_第6张图片
Paste_Image.png

通过分析可以知道 , 这段代码会将用户输入的用户名的每个字符遍历一遍
把每个字符的序号(从 0 开始算)与这个字符的ASCII码的平方相乘 , 然后整体再加上序号 , 得到的和继续对 0x42 求余 , 最后将结果加上 33 , 然后再转为ASCII码
然后再将上述结果连接在字符串 'Happy@' 之后构成注册码

分析清楚了思路 , 然后就是写注册机

#!/usr/bin/env python

username = "Hello"
counter = 0;
password = "Happy@"
for i in username:
    password = password + chr((counter + counter * ord(i) * ord(i)) % 0x42 + 33)
    counter = counter + 1
print(password)

运行后结果为 :

[实验吧](逆向工程)该题不简单_第7张图片
Paste_Image.png

得到 hello 用户的注册码为 : Happy@!GA0U

[实验吧](逆向工程)该题不简单_第8张图片
Paste_Image.png

你可能感兴趣的:([实验吧](逆向工程)该题不简单)