天天看點

BJD hamburger competitionbuu練題記錄2

buu練題記錄2

這個題比較有意思,内部的代碼比較簡單,但是包裝在一個Unity3D遊戲中。

BJD hamburger competitionbuu練題記錄2

關于Unity逆向看這裡:Unity遊戲逆向及破解方法介紹

0x00分析

是以就找對檔案就OK了,這裡我們找到Managed檔案夾下的Assembly-CSharp.dll檔案。這裡我們需要用反編譯和分析dll代碼的工具:ILSpy或者dnSpy(這裡我是用dnspy)

在函數ButtonSpawnFruit中發現端倪:

BJD hamburger competitionbuu練題記錄2

可以看到flag就藏在str裡面,将DD01903921EA24941C26A48F2CEC24E0BB0E8CC7通過sha1解碼得:1001。再将1001 進行MD5加密:

BJD hamburger competitionbuu練題記錄2

可以看到這裡總共有4種結果。再仔細看看代碼,就可以找到:

BJD hamburger competitionbuu練題記錄2

可以看到這裡有兩個很重要的點:

  • ToString(“X2”):括号裡面的大寫的X表示結果取大寫,同理若是x則是小寫;
  • Substring(0,20):隻取0到19(既前20位)

是以建構出flag為BJDCTF{B8C37E33DEFDE51CF91E}。由于是buu平台是以是flag{B8C37E33DEFDE51CF91E}

0x01總結

個人習慣在做題是用txt保留記錄,整理一下就是基本思路:

BJD hamburger competitionbuu練題記錄2

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)
           

然而并沒有跑出來,這出題人也太狗了,打他~