bugku一道逆向題目分析
極安御信發表於2022-04-27
1.檢視題目,得到的資訊只有點選一萬下,以及和和ce工具有關,先下載下來
2.下載下來是一個exe,先查殼看看程式資訊
vb寫的無殼
3.執行一遍程式,看看流程
好傢伙,要我點選一萬次按鈕才給我flag,不可能!整活!
4.分析:作者說點選一萬次有flag,那我們可以猜想有兩種可能,第一種:當按鈕按下時程式會檢測此時一個計數器變數的值是否大於一萬,如果大於一萬則顯示flag。第二種:當按鈕按下時程式會檢測此時一個計數器變數的值是否等於一萬,如果等於一萬則顯示flag。那我們依次驗證我們的猜想。
猜想一:當按鈕按下時程式會檢測此時一個計數器變數的值是否大於一萬,如果大於一萬則顯示flag
看到窗中左上角的數字隨著按下按鈕次數的增加而增加,作者又提及ce,這不得不逼我想起ce工具對數值變化的敏感啊。
那我們就開啟ce進行記憶體搜尋變化的數值,因為我們看到視窗左上腳的數值是一個整數,那我們就使用精確數字、四位元組型別搜尋
好傢伙,首次掃描以後就只有300多的結果,那豈不是再變化幾次數值就直接拿捏了嗎?那我們接著透過按下按鈕增加數值來繼續搜尋,為了增加搜尋速度我們多按幾次多增加點數值,這樣可以排除一些偶合資料
!!!!既然資料不在了,我以為是哪裡失誤了我又用同樣的方法重複了幾次,發現結果是一樣的(正如作者說的那句話,不好用的ce,懷疑是他寫的坑),那此時說明肯定這個資料不是四位元組型別,為了提高資料查詢效率,我決定換一種方法搜尋.
這次我才用未知的初始值、所有資料型別進行搜尋
為了再次誤入歧途,我不採用數值的增加或減少來跟蹤資料,而是用變化與沒變化來進行跟蹤,經過幾次資料的變與不變跟蹤得到了29個資料,那我們先加入列表進行數值更拍篩選數值(這裡我不建議二分法篩選,這樣可以降低程式的奔潰率)
加入列表以後我們點選數值欄位先把資料按照數值大小進行排序,通常這種4.5555.....E帶e的數值我們可以先不用考慮,因為這大小就和我們尋找的很離譜
那我們就先找一些看起來是整數的數值進行篩選,運氣比較好,第一個數值就篩選到了視窗左上角的變數
透過看這個數值,發現這個數值的單位1並不是視窗左上角顯示的數值的單位一,那我們先不管,先隨便改個大的數值去讓視窗的數值超過一萬就可以驗證我們的猜想一了
改了一個500800單位發現視窗的值變為了25004了,但是沒有跳出flag的提示,我按下按鈕多次也沒有,那我們的猜想一驗證失敗了,我們驗證猜想二。
猜想二:當按鈕按下時程式會檢測此時一個計數器變數的值是否等於一萬,如果等於一萬則顯示flag。
又猜想一的最後一步我們可以算出記憶體中的數值的多少單位等於視窗數值的多少單位,說幹就幹
經過簡單一算得到記憶體中的數值200單位等於視窗數值的1單位
那我們改個視窗數值的9999個單位,也就是更改記憶體的數值等於200x9999
好傢伙,一改完按下按鈕還就彈出來了,同時也驗證了我們的猜想二對了
F5這個數值(找出是什麼訪問了這個地址)
點開以後顯示空白的,因為此時這個資料沒有改變所以也不會有訪問和改寫的記錄,我們再按下幾次按鈕就一定有了
十一.我們選擇第二個(fstp和pop指令功能一樣),點選顯示反彙編程式
此時我們上下瀏覽便可以找到資訊框的提示,我把這個flag提交以後發現不對,仔細一看我覺得這個更像是base64加密的字串,於是我再進行了base64解密,發現也不對,我又試了很多常見的加密方式解密,但是都不對,無奈之下我點開了writeup才知道居然是base58加密,表示以前沒接觸過,但是透過base58解密以後便得到了flag,提交顯示正確
十二. 再附上一個base58的介紹以及與base64的區別,也算是學習到了新的一種加密方式