前言:這是學二進制逆向程序中遇到的一道題目,為了學習和成長,和大家一起分享!
題目在最下面那里,接下來一起看看吧,
首先win.exe拿進去看,運行:

看來可以拖進去ida(提示是32位,自己可以嘗試)
拖進去,優先找main函式,按F5:

看到一個do while的回圈陳述句
說明要輸入的第一個數字是2018,輸進去,看看:

對的,很好,接下去分析,

看到congratulation!
說明這里是關鍵函式,所以V3是我們的關鍵數字,要不能為空,找到V3的出處,那個sub-401610那里,進去:

我們猜測,用戶肯定有輸入的,所以這個a1應該是傳進來的外部引數
所以,我們可以判斷出這里就是有比較的,看到一串可疑的字串:

感覺很像是flag的樣子,所以這個函式要裝載字串?(猜測)
進去看看:

result是要回傳的值,a3是我們要處理的字串,V5是最后一個字符的地址,它和sub_44B160有關系,所以進去看看:

我們看到一個memcpy函式,是說把a3地址開始的資料復制到V5,V5=v3+12開始的資料,資料長度是v2,v2=v5_1-a3;
v2就是我們能知道的字串的長度,所以就是copy全部(當然這里是可選的長度,說不定下次就是一半呢,哈哈(暗示可以自己修改演算法代碼)),這樣就明朗了,V5就是copy到的暫存器,出來吧:

v4是存下來了,而V4的首地址剛好就是a1,再回去:

a1的地址就是V11的地址呀,所以,V11就是存盤字串的地址,很好,接下來繼續分析:

看到這個函式,對V11和a1進行處理了,所以我們推斷a1是用戶輸入進來的,V11剛分析了一波,是我們的字串,說明是有股匹配在里面,V11和a1是兩股勢力
我們從頭開始分析,

這是判斷V3和a1的前12位地址的內容,
不行同則調到label—24那里,后面的也是,label—24是什么,我們看看:

講V4=0,很明顯:
回傳的是V18,而v18在label—24中是恒為0的,因為v4是0,
所以這個函式是我們要避免的,不能跳到這個坑里面,所以繼續分析:

問發現426810函式就是一直在用的函式,它對a1和V11都是進行了相同的操作,所以我們進去看:

發現了關鍵函式,substr,這是個剪切字串的函式,substr(a,b,c)表示a字串從b處開始剪切c長度的字串;
回去看看一個具體的分析:

我們發現了東西,a1從8處開始剪長度為6的字串放到V12,V11從0處開始剪輯長度為6的字串放到v13,然后比較V13和V12的內容,不相等則跳到label-24(就是前面那個坑!),所以以此類推:

這段代碼就讀懂了 !
最后全部匹配完成,成功的話,V4=1,就是V3的值=1;

接下來,我們就是要把剪輯的東西還原出來了!
我們去看看對不對!

程式閃退了,說明正確!
好啦,腳本搞出來了,接下來,題目還提示拼拼拼!前面不是還有2018嗎?所以答案就是:flag{2018reverse_1s_very_easy}!

這就是全部程序啦,這道題還是很有識訓的,首先是第一個substr函式的用法!切片(任意切!),第二個就是對于整體的把握和認知,程式明白了,一切都好辦了~本題的匹配是將輸入切片和答案的切片進行匹配,通過切片達到保護作用!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194460.html
標籤:其他
下一篇:DockerPush
