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


描述 :

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

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

Paste_Image.png
Paste_Image.png

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

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

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

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

Paste_Image.png

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

Paste_Image.png

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

Paste_Image.png
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)

运行后结果为 :

Paste_Image.png

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

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容