1. 程式人生 > >百越杯 Reverse (crazy write up)

百越杯 Reverse (crazy write up)

拿到程式後,先常規跑一跑:

然後我就把它扔到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

本人是小白,希望各位大佬多多指導。