2020 神盾盃 reverse 500 === ###### tags: `CTF` 題目給定一個PE檔,執行時出現的字串在IDA string找不到,可能性包含 - 該字串加密存在於檔案中 因此當我執行x32dbg時,執行程式會出現 ![](https://i.imgur.com/DYfJXl4.png) **sub_402840** 查看這個檔案會發現前面做了很多debug檢查 - isDebugger ![](https://i.imgur.com/3G2qEsV.png) - 環境 ![](https://i.imgur.com/lmnnsME.png =300x) - 做process list 檢查 ![](https://i.imgur.com/aXjLWzm.png =500x) **sub_402760** 檢查完會去load一個resource =>**GGsumida** ![](https://i.imgur.com/YyMAPYw.png =500x) 執行流程如下: ![](https://i.imgur.com/cQ8HluT.png =400x) 利用resouce hacker去把resource拉出來,並存成bin file,rename成**GGsumida.exe** ![](https://i.imgur.com/rNp3AqX.png) 用IDA分析一下就可以找到`I can see the shit!`字串 定位在這些字串,可以看到 ![](https://i.imgur.com/tRxiFxR.png) 動態patch掉這些檢查,就可以走到後面的flag運算 ![](https://i.imgur.com/Ropqq62.png) 但是動態跑出來會是亂碼,原因是key錯誤 動態跑有兩種可能 - 5385891 - -428981405 動態找出要用來做運算的flag ![](https://i.imgur.com/TlsdJF5.png) 根據ida`LOBYTE(v62) = byte_406018[v61] ^ v95[v61 % 4];` 知道key長度是4,因為flag前四碼是**AEGI** 所以自己用xor算出key,再用這把key來算完整的flag ```python= s=[0x78,0x72,0x7F,0x79,0x6A,0x4C,0x08,0x58,0x51,0x49,0x46,0x67,0x08,0x1A,0x09,0x5F,0x19,0x4B,0x0D,0x10,0x60,0x78,0x4D,0x42,0x19,0x53,0x78,0x54,0x7D,0x4E,0x07,0x4D] key_s=['A','E','G','I'] key_int=[None]*4 for i in range(len(key_s)): key_int[i]=ord(key_s[i])^s[i] flag='' for i in range(len(s)): flag+=chr(s[i]^key_int[i%4]) print(flag) ``` 真的很讓人懷疑,有沒有算對的flag:anger: ![](https://i.imgur.com/ZqQ9upP.png)