【攻防世界009】流浪者
這是看雪CTF 2019的一個題,題目是很標準的一個比賽簽到題,沒有反調試和混淆,只需要耐心分析匯編即可。
拿到手是一個 cm.exe,根據圖標判斷是MFC程序,圖形界面程序分析起來比控制臺要更難,程序運行起來是這樣的:
隨便輸入點什么,程序提示密碼錯誤,然后就會退出:
現在需要找到判斷的邏輯,一個簡單的方法是找字符串交叉引用,shift + f12 可以查看程序的字符串:
其中,請輸入pass 這個字符串是我們不輸入密碼直接點驗證會彈出的提示信息,校驗的邏輯應該就在附近,通過這個方法我們可以找到該程序的校驗函數:
該函數首先獲取文本框中的內容:
得到用戶輸入key的字符數組后,進行了遍歷,對于三種不同的情況,分別做了不同的處理,三種情況分別是數字,小寫字母和大寫字母:
而如果出現這三種情況以外的字符,則直接判斷密碼錯。
上面的代碼是根據三種不同的情況,對一個數組進行填值,根據指令尋址方式 mov [ebp+eax*4+SomeDwordArray] ,可以推斷這是一個DWORD數組,由于不知道是干嘛用的,我將它命名為 SomeDwordArray 。對密鑰遍歷完成后,SomeDwordArray 被填值,然后作為參數傳給了下一個函數 sub_4017F0 :
這里我們大概能夠猜到這個題最終要怎么解,通過對 sub_4017F0 函數進行分析,應該可以反解出 SomeDwordArray 的值,然后通過 SomeDwordArray 反解正確的密鑰。接下來是 sub_4017F0 的分析。
sub_4017F0 是比較簡單的,最終有一個 strcmp 的字符串比較,其中一個是 “KanXueCTF2019JustForhappy” ,另一個就是運行時生成的。這個函數做的事情是遍歷 SomeDwordArray 數組,然后填充 Str1,可以直接看匯編,邏輯比較簡單。最后編寫腳本也不難,這個題的逆算法還是很好寫的XD
KanXue = "KanXueCTF2019JustForhappy" abcdef = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ" SomeDwordArray = [] Key = ""for i in range(len(KanXue)):SomeDwordArray.append(abcdef.find(KanXue[i]))print("SomeDwordArray =", SomeDwordArray)for dw in SomeDwordArray:if dw <= 9 and dw >= 0:Key += chr(dw + ord('0'))elif dw + ord('W') >= ord('a') and dw + ord('W') <= ord('z'):Key += chr(dw + ord('W'))else:Key += chr(dw + 0x1D)print(Key)解出的 key 加上flag{} 就可以了。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【攻防世界009】流浪者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【攻防世界008】answer_to_e
- 下一篇: 【攻防世界010】re1-100