目錄
- CraMe1.exe
- 第(1)問:修改exe使得出現成功提示
- 第(2)問:不修改exe輸入正確的密碼達到成功的目的
CraMe1.exe
要求:運行CraMe1.exe,提示 "u r right!"代表成功,首先修改exe使得出現成功提示,其次不修改exe輸入正確的密碼達到成功的目的,
第(1)問:修改exe使得出現成功提示
先打開運行CraMe1.exe:

??應該是輸入一串字符,經過判斷之后輸出“u r wrong”或者“u r right!”,
??用IDA打開CraMe1.exe,在String Windows搜索字串“u r right!”:

雙擊進入IDA View-A,這里是所有字串在記憶體中的虛擬地址:

選中字符陣列aURRight,按下“X”鍵,單擊將指向使用該字串所在的地址:


??在這里我們可以清楚的看到上一行的jnz(比較不相等則跳轉),如果比較之后相等則不跳轉輸出“u r right!”,如果不相等則跳轉到虛擬地址411613輸出“u r wrong”:

打開視圖可以看的更清楚代碼邏輯:

??所以我們的目的就是修改跳轉,將jnz(不相等時跳轉)改為jz(相等時跳轉),這樣只要我們沒有輸出正確的flag,都會輸出“u r right!”,
??用16進制編輯器或者OD之類的修改都行,這里用OD修改直接搜索二進制75 19找到相應的位置:

二進制編輯將75改為74:

復制到檔案,保存:

然后保存到可執行檔案,保存成名為CraMe11.exe的可執行程式,之后運行修改后的程式隨便輸入一個資料,結果如下圖所示:

第(2)問:不修改exe輸入正確的密碼達到成功的目的
??首先還是找到關鍵跳轉的地方,然后發現上面對ebp-0xc0處的資料進行了比較,根據比較是否相等來決定是否跳轉,所以向上繼續查找有沒有對ebp-0xc0的資料進行修改的地方

然后找到如圖所示的地方:

這兩處的跳轉都應該實作,然后在上邊較遠處下一個斷點然后一步一步走,最后會發現關鍵代碼是:

??對其進行分析,一共可以分為兩部分,第一部分是對前17位進行比對,要求相等,程式中給出了下列字串:
Str=swfxc{gdv}fwfctslydRddoepsckaNDMSRITPNsmr1_=2cdsef66246087138”
??然后記憶體中又給出了一串資料:
Arr={0x01,0x04,0x0E,0x0A,0x05,0x24,0x17,0x2A,0x0D,0x13,0x1C,0x0D,0x1B,0x27,0x30,0x29,0x2A,0x1A,0x14,0x3B,0x04,0x00}
首先是從記憶體中一個一個找Str[Arr[i]]與輸入的字串進行比較,只比較前17位,然后如果不相等就會給ebp-0xC0處的資料賦值為1,然后跳轉到失敗,
??所以前17位就是Str[Arr[i]],后面還有比較的地方可以得出后面還有5位分別為0x31,0x30,0x32,0x34,0x7D

將它們一個一個轉換成Ascii碼對應的字串,最后得出flag為:
wctf{Pe_cRackme1_1024}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259059.html
標籤:其他
上一篇:3.9 Atomic原子操作(CAS操作,以AtomicInteger為例,硬肛Jvm原始碼)
下一篇:join方法內部實際是wait方法,不能理解的是 在a執行緒中,b執行緒呼叫了join方法,為什么是a執行緒一直在等待直至b執行緒結束。
