題目:https://buuoj.cn/challenges#[ACTF%E6%96%B0%E7%94%9F%E8%B5%9B2020]usualCrypt
下載、解壓後,文件夾內有兩個檔案,直接把名為base.exe
的那個拉入IDA進行分析( 另一個檔案不知有何作用 )。進入main
函數查看偽代碼,經分析推測整體代碼邏輯為接收輸入->加密->與特定字串對比->判斷正確與否
,進入加密函數sub_401080
繼續分析
發現是base64加密,但在前面有個可疑的函數sub_401000
,抱著好奇之心,先點進去看看
可以看出是將base64的索引表進行了魔改,BASE64_table_40E0A0
為原索引表的起始地址,byte_40E0AA
則是在起始地址+10byte的位置,而索引表進行的改動也就是簡單的位置亙換
返回sub_401080
繼續分析,看到最後return
時竟然是一個函數,點入去查看
第一眼看到簡直不知道是三小,但在分析過後,看到下圖紅框中的關鍵特徵,推測是將字母的大小寫亙換
最後,編寫如下腳本進行解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<iostream> #include<string> using namespace std;
int main() { string realTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; string wrongTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (int i = 6; i < 15; i++) { char v1 = wrongTable[i + 10]; wrongTable[i + 10] = wrongTable[i]; wrongTable[i] = v1; } string str = "zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9"; for (int i = 0; i < str.length(); i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = (char)(str[i] - 32); } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = (char)(str[i] + 32); } } string decode = ""; for (int i = 0; i < str.length(); i++) { decode += realTable[wrongTable.find(str[i])]; }
cout << decode << endl; }
|
將上面得出的decode
進行base64解密即可得出flag( 解碼網站 )
flag{bAse64_h2s_a_Surprise}