OllyDBG - 第十二章 | 反匯編練習 (三) 下
不斷反匯編不斷的對不了解不懂的組合語言,努力看懂⋯⋯。
檔案下載
相關的目的程式和使用的工具,請直接至OllyDBG - 第十一章 | 反匯編練習 (三) 上,這邊下載
分析
延續上一篇的分析過程
首先必須要有
Keyfile.dat
的檔案然後下方會去讀取這個檔案ReadFile函數
而
test eax,eax
應該是再次確認有讀取到檔,沒有的則跳失敗xor ebx,ebx
和xor esi,esi
為清零在看
cmp dword ptr ds:[402173],10
這句指令要搭配下方的jl short 004010F7
一起觀看jl
表示若低於則跳越所以
cmp dword ptr ds:[402173],10
就是說[402173]
裡面存放的值,如果小於十六進制的10 (也就是16),則跳到004010F7
失敗得地方那
402173
是哪裡來的?可以看到上方
ReadFile
前面push
進去的參數有一個push 00402173
而
push 00402173
這是第四個參數,lpNumberOfBytesRead
表示讀取了多少個Byte
這邊的分析結果就是
Keyfile.dat
裡面的內容,必須要大於16個字
1 | 0040109A > \6A 00 push 0 ; /pOverlapped = NULL |
- 將
KeyFile.dat
編輯輸入AAAAAAAAAAAAAAAAAAAA
(故意填寫20個) - 成功繼續向下執行了
- 當前 ebx = 00000000
0040211A = 0040211A (ASCII “AAAAAAAAAAAAAAAAAAAA”) mov al,byte ptr ds:[ebx+40211A]
這句表示每次拿0040211A
裡面的一個字元,然後根據ebx
增加偏移量,也就是每次迴圈一次就往後拿一個字元cmp al,0
和je short 004010D3
表示拿當前取得字元,去和十六進制的0比較 (也就是空字元(Null)),je
若等於則跳越到004010D3
- 而
004010D3
判斷esi
若低於8 則跳到失敗
- 而
分析到這邊可以判斷出,每讀出一個字元,如果讀到為
空字元(Null)
,則會去確認目前該esi的長度是否大於8,如果低於就失敗
- 繼續分析
cmp al,47
,比較讀取的字元是否為十六進制的47 (也就是G
),如果不為G
就跳過inc esi
,這句是esi+。
分析到這邊結合剛剛上面得分析,esi 需要 大於8,然後這邊如果不為
G
,就不+1,所以Keyfile.dat
裡面的字元,必須要是G
,而且必須至少有8個G
1 | 004010C1 > /8A83 1A214000 mov al,byte ptr ds:[ebx+40211A] |
綜合以上的序號條件
必須要有
KeyFile.dat
檔內容的長度必須要等於或是大於16個字元
內容裡面
0
的部分不能出現在第八位以前內容必須要包含
G
有八個以上將
KeyFile.dat
編輯輸入GGGGGGGGAAAAAAAA
(成功)將
KeyFile.dat
編輯輸入GAGAGAGAGAGAGAGA
(成功)
- 將
KeyFile.dat
編輯輸入GGGGGGGAAAAAAAAA
(失敗,因為只有7個G)
總結
因為必須要盡量一行一行去分析,並且去說明。希望透過這樣的分析,可以更加的懂反匯編的過程和語法。
已經做了幾個反匯編練習,對於組合語言的認識越是進步,對於跳越使令或許還不熟,那沒關係,有表可以參考,參考久了就是你的。
額外補充
這邊要補充的是
- 通常
cmp xxx, xxx
,需要一起看下一行的跳越指令(je
,jne
,jl
…等等),因為這樣一起看,才可以知道這個cmp
是希望比對這兩個值,是什麼條件。 mov al,byte ptr ds:[ebx+40211A]
再來補充,當用[]
包起來的,就表示是要取這個地址裡面的值
,像這句就是,將ebx
地址加上40211A
,然後取值。
假設ebx = 00000001
00000001 + 0x40211A = 0x40211B
假設0x40211B 裡面的值為 47 47 47 47。
那就是說al 的值將會是 00000047。 (al = eax (8-bit))
註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (三)