1. 程式人生 > >該提不簡單

該提不簡單

壓縮包 鏈接 fin nba counter 要求 註釋 pac pytho

無語了,想給你們制造點懸念都沒有了,哎!直接去做題吧
解題鏈接: 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


作者:王一航
鏈接:http://www.jianshu.com/p/6e7396cdb0f1
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

該提不簡單