最近在網上找到一個逆向分析挑戰的網站,http://flare-on.com/。在這裡可以下載到該網站出的一系列的逆向分析的題目,我下載了2017年的練習,總共12道題目。最近想把這些題目的結題過程寫下來,當做一些積累吧。 第一道題目是一個網頁題目,開始就給了一個login.html文件 用文本編輯 ...
最近在網上找到一個逆向分析挑戰的網站,http://flare-on.com/。在這裡可以下載到該網站出的一系列的逆向分析的題目,我下載了2017年的練習,總共12道題目。最近想把這些題目的結題過程寫下來,當做一些積累吧。
第一道題目是一個網頁題目,開始就給了一個login.html文件
用文本編輯器打開,發現裡面是這樣一段html
<!DOCTYPE Html /> <html> <head> <title>FLARE On 2017</title> </head> <body> <input type="text" name="flag" id="flag" value="Enter the flag" /> <input type="button" id="prompt" value="Click to check the flag" /> <script type="text/javascript"> document.getElementById("prompt").onclick = function () { var flag = document.getElementById("flag").value; var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);}); if ("[email protected]" == rotFlag) { alert("Correct flag!"); } else { alert("Incorrect flag, rot again"); } } </script> </body> </html>
簡單看下,知道這個網頁上提供了一個文本框,然後對輸入的文本進行加密,並將加密後的文本和"[email protected]"這段字元串進行對比。這裡面的加密演算法則是
var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
如果能夠找到解密演算法,然後利用該演算法對"[email protected]"進行解密操作,就能夠得到輸入的值。現在對這段加密演算法進行分析:
1、該演算法針對輸入的每一個字元進行處理,且處理範圍僅限大小寫字母
2、90和122分別對應'Z'和'z',前面的大小判斷是為了確定該字元是大寫還是小寫
3、後面的判斷則是用'Z'和'z'與該字元加13之後的值進行比較,如大於,變成該字元+13,否則是該字元-13
4、而滿足大於條件的只有字母表中前13個字元滿足
這樣看來,這段加密演算法其實就是前13個字元和後13個字元的替換操作。依據該分析寫解密程式:
char de(char input) { if ((input >= 'A' && input < 'A' + 13) || (input >= 'a' && input < 'a' + 13)) { return input + 13; } else if ((input >= 'A' + 13 && input <= 'Z') || (input >= 'a' + 13 && input <= 'z')) { return input - 13; } else return input; } int main() { char result[] = "[email protected]"; char origin[38]; for (auto x : origin) { x = 0; } for (int i = 0; i < strlen(result) + 1; i++) { origin[i] = de(result[i]); } printf("origin input is %s\n", origin); return 0; }
輸出結果為:
測試結果:
以上為第一個的分析解決方案,雖然很簡單,但開始的第一步邁出去了,對於練習也好,對於博客也好。雖然寫的很簡單,可能有地方寫的不好,希望看到的大家批評指正!