題目來源於網上,具體未知。
運行軟件後如圖:
看起來很嚇人有沒有?
實際點擊頁面後,發現只是一張圖片,輸入框可以輸入,輸入完成後,只有Decrypt可以點擊。
先查下殼有沒有,發現沒有,發現編譯器是VS2017。
使用IDA打開,IDA首先找到了WinMain入口。
因爲是GUI程序, 所以入口點是WinMain。不過目前關注的重點不是在這裏,先要找到合適的位置下斷點。
GUI程序存在輸入框,所以尋找下獲取輸入框內容的API函數,這裏找到了GetDlgItemTextA,下斷點調試後發現確實是。
在IDA裏找交叉引用的地方找到GetDlgItemTextA,F5翻譯下。
很清楚顯示爲對話框過程函數,這裏應該就是主邏輯了。
來到下面GetDlgItemTextA調用處
大概的處理流程爲先獲取輸入框的內容,接着判斷輸入字符串的長度是不是18個字節。
如果是則繼續往下執行,如果不是則直接返回錯誤並彈窗。
這裏我們跟進等於18的流程裏,sub_4013B0函數爲複製輸入框內容的值到Dst空間。
sub_401010函數爲算法核心部分,如果返回值爲1則成功,返回爲0則失敗彈窗。
雙擊進入sub_401010裏,查看源彙編指令可知a1這裏翻譯錯了,應該爲String。
這裏的處理流程爲,將String每個字節與0xCC進行異或運算的結果再賦值給源地址。
之後再每個字節與byte_404000地址空間的每個字節進行比較,如果每個都相等則最後返回值爲1。
所以我們可以寫出註冊機,逆算法。
# coding=utf-8
key = [
0xFD, 0x93, 0xA8, 0x83, 0x93, 0xA2, 0xFC, 0xB8, 0x93, 0xBB,
0x8D, 0xA2, 0xA2, 0xAD, 0x93, 0xAF, 0xBE, 0xB5
]
flag = ""
for i in range(len(key)):
flag += chr(key[i] ^ 0xCC)
print(flag)