buu練題記錄2
這個題比較有意思,内部的代碼比較簡單,但是包裝在一個Unity3D遊戲中。
關于Unity逆向看這裡:Unity遊戲逆向及破解方法介紹
0x00分析
是以就找對檔案就OK了,這裡我們找到Managed檔案夾下的Assembly-CSharp.dll檔案。這裡我們需要用反編譯和分析dll代碼的工具:ILSpy或者dnSpy(這裡我是用dnspy)
在函數ButtonSpawnFruit中發現端倪:
可以看到flag就藏在str裡面,将DD01903921EA24941C26A48F2CEC24E0BB0E8CC7通過sha1解碼得:1001。再将1001 進行MD5加密:
可以看到這裡總共有4種結果。再仔細看看代碼,就可以找到:
可以看到這裡有兩個很重要的點:
- ToString(“X2”):括号裡面的大寫的X表示結果取大寫,同理若是x則是小寫;
- Substring(0,20):隻取0到19(既前20位)
是以建構出flag為BJDCTF{B8C37E33DEFDE51CF91E}。由于是buu平台是以是flag{B8C37E33DEFDE51CF91E}
0x01總結
個人習慣在做題是用txt保留記錄,整理一下就是基本思路:
0x02插曲
在看到源碼之後我最開始想嘗試能不能通過直接玩遊戲玩出來,但是然後寫了一個爆破的exp
def humburger(Init,i):
if i == 1:
Init += 997
elif i == 2:
Init -= 127
elif i == 3:
Init *= 3
elif i == 4:
Init ^= 18
elif i == 5:
Init += 29
elif i == 6:
Init -= 47
elif i == 7:
Init *= 5
elif i == 8:
Init ^= 87
elif i == 9:
Init ^= 127
return Init
for j in range(111111,200000):
Init = 0
chu = 100000
for k in range(5):
step = int(j/chu)%10
Init = humburger(Init,step)
chu = int(chu/10)
if Init == 1001:
print(j)
if j == 123459 or j == 134579:
print(Init)
然而并沒有跑出來,這出題人也太狗了,打他~