演算法分析:BUUCTF-2019全國賽的一道逆向題

極安御信發表於2022-04-13

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


相關文章