已經進入到Reverse兩顆星的題目,現在會以一天一題的方式,一方面比較好吸收,一方面兩顆星的題目也不是很容易,我也要花一些時間在解題,至於超過我的能力範圍就會進入下一個領域囉~
執行後又是電腦不夠快
結論:換一台吧
今天一樣用昨天介紹的工具 ghidra
跟上次那題結構大同小異,我們就一個一個點進去看看
在set_timer這邊這次給我們三秒,超過三秒就會中止程式
這邊題外話一下,還記得上次那題也是電腦不夠快的題目,他在這個函式set_timer只給我們一秒,其實有另一種解法就是增加時間,只要在時間內做完就不會觸發alarm中止程式,所以可以去上次那題看看怎麼把他的時間改過來吧,一樣可以使用hexeditor做修改
接著我們繼續看其他的函式,看到get_key中又呼叫了一個calculate_key這個函式
這裡又呼叫了fib的函式,他的參數是0x402(十進位是1026)
直接貼出decompile後的程式碼比較容易閱讀
大家看到這個函式應該不陌生吧,一開始學程式一定會學到的費氏數列,這邊要我們求第1026位的數就是以下這麼大的數11798692818055232550147578884125865608089028544560913468519228968187430794620907976123201977895385245239705082830656904630178314159866370495211539023461052682811230321796555930907722724384131648527339458407317543768
不過這邊的資料型態是unsigned long他的範圍是0~2的32次方-1
所以大概知道可以從這個地方下手,這邊可以直接利用python,將上面這串轉成32bit
x=11798692818055232550147578884125865608089028544560913468519228968187430794620907976123201977895385245239705082830656904630178314159866370495211539023461052682811230321796555930907722724384131648527339458407317543768
print(x&(2**32-1))
#4144667480
我們已經把值算出來了,不過這邊還有一個問題就是,在他原始程式做這段要花太多時間就會觸發alarm
既然我們已經把值算出來了這個函式就沒有存在的必要了
我們只需要在Flag print出來之前修改暫存器的值就好了,記得前幾天有提到nop這個指令,他就是什麼都不做的意思,所以只要透過hexeditor將這些呼叫函式的地方改成nop就可以跳過原本所設定的時間以及要花費很多時間的的費氏數列運算
那這時我們要將剛剛所算出來的數值在print出flag以前更改暫存器內容就好
只要在我們進decrypt_flag這個函式之前將暫存器內容更改
所以這邊先在40080d這個位置設定一個中斷點,等執行到這邊時再更改eax暫存器
這樣就拿到Flag囉~