演算法分析:BUUCTF-2019全國賽的一道逆向題
1.對程式進行查殼,發現是個無殼vc編譯的
2.執行程式,檢視程式執行流程,在password中輸入12345678,按下Crack按鈕以後沒有任何提示程式結束執行
3.依舊先讓od跑一遍,以前說過的這種透過使用者輸入然後再按下按鈕觸發事件的先對GetDlgItemTextA函式斷點看程式是否是用這個函式從輸入框獲取使用者輸入的
在輸入框輸入12345678按下Crack按鈕後成功在GetDlgItemTextA函式斷下,由於我們的斷點是GetDlgItemTextA函式的入口點,屬於系統領空,所以我們直接往下找到離GetDlgItemTextA函式入口點最近的retn斷點跑完GetDlgItemTextA這個函式去檢視按鈕的其他邏輯事件
4.檢視按鈕其他邏輯事件
跑完GetDlgItemTextA函式後發現往下有一個ExitProcess的函式,這讓我們聯想到了我們正常執行程式時候輸入12345678程式結束執行,那可以肯定這個函式就是在我們輸入12345678按下Crack按鈕觸發的,從這個函式往上看發現在這個函式之前有個jbe跳轉,點選一看,如果跳轉便是跳過這個ExitProcess的執行,說明這個jbe時一個關鍵點,那我們對jbe這個跳轉的條件 cmp eax,0x6進行斷點分析
jbe的條件是對比eax的值是否小於等於0x6,如果滿足則就跳過退出程式函式,我們一看eax的值便是我們輸入12345678的長度,那我們重新輸入六個數123456作為使用者輸入的值執行到這裡
果然,eax此時確實是使用者輸入的長度,而且jbe跳過了退出,ecx存入了我們輸入的123456,但是是以字串形式存入(這裡要注意,後面會用到)那我們繼續走跳過退出後的程式碼
經過這個函式後,eax的值變為了0x1e240,我們在看這個call的引數只有一個ecx,那在這個call之前我們知道ecx的值是字串‘’123456“的地址,那說明這個0x1e240和這個123456有關係,一個是字串一個是十六進位制,這個我們就可以猜想是否這個0x1e240是”123456“轉換的十六進位制數,那我們用程式碼驗證一下
#include
int main()
{
char num[6] = "123456";
int last = atol(num);
printf("%x",last);
}
果然,我們的猜想是正確的,那繼續往下走
這幾行程式碼將eax的值賦值給了edx,而且edx還加1,此時還出現了一個對比jnz跳轉,跳轉的條件是edx的值是否等於0x7b,不等於則跳轉,我測試了一下跳轉後的流程是重複執行獲取使用者輸入,所以我們為了不結束程式則要使得edx等於0x7b,也就是說需要eax+1 = 0x7b,我們剛才分析過eax是我們輸入字串的轉16進位制數,那我們此時可以得知eax=0x7b-1 = (字元轉十六進位制數)使用者輸入,最後可以用程式碼算出我們要輸入什麼,這裡要強調一個問題,從對GetDlgItemTextA斷點以來,我們輸入的變化情況:123456(整數)->”123456“(字串)->0x1e240(十六進位制數),其實我們輸入的就是經歷了兩個函式itoa->atol;所以這裡我們可以直接得知我們輸入要滿足其等於0x7b-1,所以就是數字122,那我們從新代開程式斷點在上圖這個cmp
此時,下面又出現了三個接連的對比,分別是地址ss:[ebp-0x101]、ss:[ebp-0xFF]、ss:[ebp-0x100]的值分別和0x78、0x7a、0x79對比,這三個jnz經過測試都是跳轉到重複執行獲取使用者輸入和這一系列的判斷,那此時我們來分析這三個地址的特殊性,發現我們剛才輸入那三個數122的地址是ss:[ebp-0x108],第一個地址在122地址往後3個位元組,第二個地址在122地址往後1個位元組,第三個地址在122地址往後2個位元組,那這三個地址的值到底來自哪裡呢?我們知道這個Crake的第一個要求便是使用者輸入的值小於等於6,說明我們可以輸入6個長度的任意字元,那剩下的這三個位元組加上122的長度剛好是六個。那還不簡單?直接找出這三個不滿足jnz跳轉的值是多少就行了
條件:
ss:[ebp-0x101] =0x78 字元:z
ss:[ebp-0xFF] = 0x7a 字元:x
ss:[ebp-0x100] = 0x79 字元:y
按位置排序出來便是xyz,那我們重新開啟輸入122xyz斷點最後一個jnz
5.執行到這裡看到了flag字元,估計接下來就是出現flag的時候了,繼續單步執行到正確flag提示資訊出現前是這些程式碼,由於沒有什麼演算法存在,這些程式碼知識用來拼接flag的所以就不分析了
004011E4 . A1 A02F4200 mov eax,dword ptr ds:[0x422FA0] ; flag
004011E9 . 8985 F4FDFFFF mov dword ptr ss:[ebp-0x20C],eax
004011EF . 8A0D A42F4200 mov cl,byte ptr ds:[0x422FA4]
004011F5 . 888D F8FDFFFF mov byte ptr ss:[ebp-0x208],cl
004011FB . B9 3F000000 mov ecx,0x3F
00401200 . 33C0 xor eax,eax
00401202 . 8DBD F9FDFFFF lea edi,dword ptr ss:[ebp-0x207]
00401208 . F3:AB rep stos dword ptr es:[edi]
0040120A . 66:AB stos word ptr es:[edi]
0040120C . AA stos byte ptr es:[edi]
0040120D . 6A 0A push 0xA ; /Arg3 = 0000000A
0040120F . 8D95 F0FCFFFF lea edx,dword ptr ss:[ebp-0x310] ; |
00401215 . 52 push edx ; |Arg2 = 00000079
00401216 . 8B85 F8FEFFFF mov eax,dword ptr ss:[ebp-0x108] ; |
0040121C . 50 push eax ; |Arg1 = 00000078
0040121D . E8 9E290000 call 1.00403BC0 ; \1.00403BC0
00401222 . 83C4 0C add esp,0xC
00401225 . 68 44204200 push 1.00422044 ; {
0040122A . 8D8D F4FDFFFF lea ecx,dword ptr ss:[ebp-0x20C]
00401230 . 51 push ecx
00401231 . E8 3A020000 call 1.00401470
00401236 . 83C4 08 add esp,0x8
00401239 . 8D95 F0FCFFFF lea edx,dword ptr ss:[ebp-0x310]
0040123F . 52 push edx
00401240 . 8D85 F4FDFFFF lea eax,dword ptr ss:[ebp-0x20C]
00401246 . 50 push eax
00401247 . E8 24020000 call 1.00401470
0040124C . 83C4 08 add esp,0x8
0040124F . 68 40204200 push 1.00422040 ; _
00401254 . 8D8D F4FDFFFF lea ecx,dword ptr ss:[ebp-0x20C]
0040125A . 51 push ecx
0040125B . E8 10020000 call 1.00401470
00401260 . 83C4 08 add esp,0x8
00401263 . 68 2C204200 push 1.0042202C ; Buff3r_0v3rf|0w
00401268 . 8D95 F4FDFFFF lea edx,dword ptr ss:[ebp-0x20C]
0040126E . 52 push edx
0040126F . E8 FC010000 call 1.00401470
00401274 . 83C4 08 add esp,0x8
00401277 . 68 28204200 push 1.00422028 ; }
0040127C . 8D85 F4FDFFFF lea eax,dword ptr ss:[ebp-0x20C]
00401282 . 50 push eax
00401283 . E8 E8010000 call 1.00401470
ok了,最後的資訊框提示了flag
相關文章
- bugku一道逆向題目分析2022-04-27
- 一道演算法題的分析2021-09-09演算法
- 演算法分析:看雪CTF2019的一道逆向題目2022-03-24演算法TF2
- 一道關於逆向的實戰CTF題目分析2024-07-12
- 一道面試題的分析2018-10-28面試題
- 一道演算法題2018-03-15演算法
- 記一道國際賽CTF web題2023-05-04Web
- 一道前端演算法題2018-12-11前端演算法
- Js逆向之猿人學比賽第一題2020-12-03JS
- 一道位運算的演算法題2014-10-15演算法
- 猿人學web端爬蟲攻防大賽賽題第16題——js逆向 - window蜜罐2024-11-02Web爬蟲JS
- 一道有意思的面試演算法題2019-01-04面試演算法
- 記一道毫無思路的演算法題2014-10-23演算法
- 「每日一道演算法題」Reverse Integer2019-01-03演算法
- CCTF部分賽題分析2016-04-29
- 一道java面試題分析及思考2017-11-01Java面試題
- 一道簡單的分配演算法題,求解2021-11-16演算法
- 演算法精講:分享一道值得分享的演算法題2019-05-04演算法
- 一道趣味數學演算法問題2017-02-17演算法
- 使用 AI 解決一道演算法題2024-07-13AI演算法
- 一道演算法題,引出collections.Counter的特殊用法2020-10-14演算法
- 最考驗換位思考的一道演算法題2018-04-19演算法
- 前端面試的一道演算法題(使用canvas解答)2017-06-11前端面試演算法Canvas
- 病毒逆向分析2018-03-18
- 對VM逆向的分析(CTF)(比較經典的一個虛擬機器逆向題目)2021-06-04虛擬機
- 競賽選手問題的解答演算法2008-01-03演算法
- 對一道if-else相關的程式題的簡單分析2015-05-23
- CreateProcess逆向分析-3環使用者層逆向分析(一)2022-03-11
- 每日一道演算法題:1.兩數之和2019-04-29演算法
- 每天一道演算法題:顛倒整數2018-03-14演算法
- 每天一道演算法題:Z字形轉換2018-03-13演算法
- LeetCode演算法簡單題--JavaScript(每天一道題)2020-10-19LeetCode演算法JavaScript
- 逆向中常見的加密演算法2024-03-29加密演算法
- 木馬逆向分析2015-11-15
- 每日一道演算法題之矩陣的Z字型遍歷2019-04-11演算法矩陣
- 一道題2024-04-15
- Linux 下的逆向分析-初探2022-06-26Linux
- 全國大學生資訊保安競賽初賽writeup2020-08-27