iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Security

逆向系列 第 8

逆向題目練習 - babyc

  • 分享至 

  • xImage
  •  

這是我人生中解出的第二題逆向題目,雖然很簡單,但我也從中了解了解題的運作模式。

題目來源

https://www.youtube.com/watch?v=wPDYgcxRuxo&t=119s

題目

babyc.png

解析

  1. 查看主函式 main() ,第 13 行
    宣告了 3 個分別為 flag[]key[]input[]的字元陣列

  2. 查看第 22 行 enc(input, key)

  3. 查看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] 的值
  4. 查看第 24 ~ 37 行:
    判斷使用者輸入的 input 是否與 flag 相同,若相同則 found ≠ 0,若不同則 found = 0

解題

  • 背景知識
    二進位數字對同個二進位數字進行 2 次 XOR 後,會變成原來的二進位數字

    • 1 XOR 0 XOR 0 = 1
    • 1 XOR 1 XOR 1 = 1
    • 0 XOR 0 XOR 0 = 0
    • 0 XOR 1 XOR 1 = 0
  • 應用
    flag[] 再進行一次 XOR,即可還原成原始的 flag[]

  • 解答
    在程式最後面加上 enc(flag, key) ,並輸出 printf(%s, flag); 即可得到

    Flag{Simple_C_Chall}
    

上一篇
逆向工程與 C 語言
下一篇
逆向題目練習 - 組合語言
系列文
逆向30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言