這是我人生中解出的第二題逆向題目,雖然很簡單,但我也從中了解了解題的運作模式。
https://www.youtube.com/watch?v=wPDYgcxRuxo&t=119s
查看主函式 main()
,第 13 行
宣告了 3 個分別為 flag[]
、 key[]
、 input[]
的字元陣列
查看第 22 行 enc(input, key)
查看void enc(char* str, char* key)
,第 4 行
傳址呼叫enc()
函式採用傳址呼叫,因此函式內對 str[]
、 key[]
的變動皆會影響 input[]
、key[]
查看 for()
str[i]
與 key[i % key_len]
進行 XOR 後存入 str[i]
key[i % key_len]
中 i % key_len
,是因為 key
的長度小於 flag
,所以使用取餘數%
的方式反覆循環 key[i]
的值查看第 24 ~ 37 行:
判斷使用者輸入的 input 是否與 flag 相同,若相同則 found ≠ 0,若不同則 found = 0
背景知識
二進位數字對同個二進位數字進行 2 次 XOR 後,會變成原來的二進位數字
應用
將 flag[]
再進行一次 XOR,即可還原成原始的 flag[]
解答
在程式最後面加上 enc(flag, key)
,並輸出 printf(%s, flag);
即可得到
Flag{Simple_C_Chall}