BuringStraw

BuringStraw

白帽駭客大賽 11 RE2

我(在 reverse 题中)最討厭的語言 ——go。

被 ida 裡出現的奇怪結構體嚇暈。

main 函數在 cutter 裡怎麼是 runtime.text 啊(不過在 sym.runtime.main 裡被調用了)。

首先,整個程式被包裹在一個大大的死迴圈中,然後不斷 scanf % d。當讀到 EOF 的時候停止,判斷是不是 13 個數字(表面上,實際上是 12 個)數字。

如果當前數字不是 eof,就會被 append 到陣列裡(下標甚至從 1 開始,第 0 位是 0)。還有一個用來統計每個數字出現次數的陣列,只能出現一次。

check 的過程是這樣的,因為中間有一大堆判斷陣列是否越界的語句(已刪),所以容易被搞暈,導致看不到 var_1e8h 的初值。

var_1e8h = 1;
uVar5 = 1;
do {
    uVar2 = *(uint64_t *)(var_18h + uVar5 * 8);
    var_1e8h = ((&var_168h)[uVar2] + -1) * (&var_1d0h)[var_1e0h - uVar5] + var_1e8h;

    uVar2 = *(uint64_t *)(var_18h + uVar5 * 8);
    while (uVar2 = uVar2 + 1, (int64_t)uVar2 <= var_1e0h) {
        (&var_168h)[uVar2] = (&var_168h)[uVar2] + -1;
    }
    uVar4 = (uint32_t)uVar2;
    uVar5 = uVar5 + 1;
} while ((int64_t)uVar5 <= var_1e0h);

換成 python 就是(寫的時候把陣列哪個是哪個弄錯了,對著組合改的)

def check(inpt):
    #inpt = [0,6,12,9,4,5,1,2,8,10,7,11,3]
    len_nums = 0xd
    v1d0h = [1,1,2,6,0x18,0x78,0x02d0,0x13b0,0x9d80,0x058980,0x375f00,0x02611500,0x1c8cfc00]

    v18h = []
    v168h = list(range(0xd))

    for i in inpt:
        v18h.append(i)

    i = 1
    s = 1
    while True:
        #print(v168h)
        r11 = v18h
        r8 = r11[i]
        rbx = v168h[r8]-1
        r8=len_nums-1-i
        rbp = v1d0h[r8]
        #print(hex(rbx), hex(rbp))
        s += (rbx*rbp)
        j = v18h[i]+1
        while j<=len_nums-1:
            v168h[j] -= 1
            j+=1
        i+=1
        if i > len_nums -1:
            break
    print(hex(s))
    return s == 0xe37f550

之後的正解大概是一個數學問題。https://dakutenpura.hatenablog.com/entry/2016/06/28/030236

不過我不會,於是打了暴搜,搜permutations(range(0,13)),卡爆了。

但是經過觀察發現,s 竟然從 1 開始,每次增加 1。於是就變成了:

j = 0
for i in permutations(range(0,13)):
    #sys.stdout.write("%s\n"%str(i))
    j += 1
    if j == 0xe37f550:
        print(check(i))
        print(i)
        break
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。