百越杯 Reverse (crazy write up)
阿新 • • 發佈:2018-12-17
拿到程式後,先常規跑一跑:
然後我就把它扔到IDA看看
IDA SHIFT + F12
看到flag關鍵字,於是我就點選進去,並檢視交叉引用
由此分析可以得出,flag可能是在if判斷正確後輸出的
於是,接下來我們分析一下判斷函式 getSerial()
可以看出,大概就是對this所指向的字元進行逐個對比驗證。
即 this[16 + i] 與 this[80 + i] 進行對比 ,而 this 就是 v23傳進來的。
接下來我們看看v23的值是怎麼得到的
由IDA可以看出 v23在聲明後,第一次出現在HighTemplar()裡面,第二次出現在calculate()裡面
我們分析一下HighTemplar()
a1對應v23
a2對應v18
也就是把v18的內容放到v23裡面。
再分析calculate()
這裡是對v23進行加密
看到這裡有想起什麼嗎?
v18放進(v23+16)這個位置,“327a6c4304ad5938eaf0efb6cc3e53dc”放到(v23+80)這個位置,對(v23+16)這個位置的字串進行加密,v23[16 + i] 與 v23[80 + i] 進行對比,得出結果
我們接來下看看v18是怎麼來的:
可以看出v18是通過cin輸入得到的。
那麼我們就可以整理出程式判斷的流程:
cin -> v18 -> v23 -> 加密 -> 判斷密文 -> 得出結果
解題思路:
我們根據加密演算法,對密文解密即可:
payload:
code = list("327a6c4304ad5938eaf0efb6cc3e53dc")
for i in range(32):
code[i] = chr((ord(code[i])-11)^0x13)
for i in range(32):
code[i] = chr((ord(code[i])-23)^0x50)
print("".join(code))
執行結果:tMx~qdstOs~crvtwb~aOba}qddtbrtcd
本人是小白,希望各位大佬多多指導。