下載附件,在Linux中運行觀察。
發現需要輸入Key,猜測Key即為Flag。
將文件拖入IDA64反匯編觀察代碼
std::operator<<<std::char_traits<char>>(&std::cout, "Enter the valid key!\n", envp); std::operator>><char,std::char_traits<char>>(&edata, &v42); std::allocator<char>::allocator(&v38); std::string::string(&v39, &v42, &v38); md5(&v40, &v39); v41 = (_BYTE *)std::string::c_str((std::string *)&v40); std::string::~string((std::string *)&v40); std::string::~string((std::string *)&v39); std::allocator<char>::~allocator(&v38);
判斷為MD5加密
結合上端代碼,接着看如下代碼
if ( *v41 != 55 || v41[1] != 56 || v41[2] != 48 || v41[3] != 52 || v41[4] != 51 || v41[5] != 56 || v41[6] != 100 || v41[7] != 53 || v41[8] != 98 || v41[9] != 54 || v41[10] != 101 || v41[11] != 50 || v41[12] != 57 || v41[13] != 100 || v41[14] != 98 || v41[15] != 48 || v41[16] != 56 || v41[17] != 57 || v41[18] != 56 || v41[19] != 98 || v41[20] != 99 || v41[21] != 52 || v41[22] != 102 || v41[23] != 48 || v41[24] != 50 || v41[25] != 50 || v41[26] != 53 || v41[27] != 57 || v41[28] != 51 || v41[29] != 53 || v41[30] != 99 || v41[31] != 48 )
從if判斷條件中,可以得知加密后的密文為 55,56,48...........
編寫python獲取密文字符串
md5 = [55, 56, 48, 52, 51, 56, 100, 53, 98, 54, 101, 50, 57, 100, 98, 48, 56, 57, 56, 98, 99, 52, 102, 48, 50, 50, 53, 57, 51, 53, 99, 48] flag = '' for i in md5: flag += chr(i) print(flag)
輸出:780438d5b6e29db0898bc4f0225935c0
打開MD5在線解密網站解密
在Linux輸入grape發現密鑰錯誤
至此一度以為自己思路錯誤或者原始密文輸入有誤,后來了解 md5(md5($pass)) 的具體含義找出正確答案
md5(md5($pass)) :第一次加密后,結果轉換成小寫,對結果再加密一次
則解密為:解密一次后,再解密一次
具體加密流程為:grape→b781cbb29054db12f88f08c6e161c199→780438d5b6e29db0898bc4f0225935c0
在線解密網站直接實現了兩次解密,省略了中間值,而我們的程序只進行了一次MD5加密,所以當Key為b781cbb29054db12f88f08c6e161c199加密一次后,與780438d5b6e29db0898bc4f0225935c0相匹配,即可通過驗證。
提交flag,正確!
解題完畢。
收獲:了解更多的加密算法細節