Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-16   OllyDBG   瀏覽次數:

OllyDBG - 第十二章 | 反匯編練習 (三) 下

不斷反匯編不斷的對不了解不懂的組合語言,努力看懂⋯⋯。

檔案下載

相關的目的程式和使用的工具,請直接至OllyDBG - 第十一章 | 反匯編練習 (三) 上,這邊下載

分析

延續上一篇的分析過程

  • 首先必須要有Keyfile.dat的檔案

  • 然後下方會去讀取這個檔案ReadFile函數

  • test eax,eax應該是再次確認有讀取到檔,沒有的則跳失敗

  • xor ebx,ebxxor 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
2
3
4
5
6
7
8
9
10
11
12
13
0040109A   > \6A 00         push 0                                   ; /pOverlapped = NULL
0040109C . 68 73214000 push 00402173 ; |pBytesRead = reverseM.00402173
004010A1 . 6A 46 push 46 ; |BytesToRead = 46 (70.)
004010A3 . 68 1A214000 push 0040211A ; |Buffer = reverseM.0040211A
004010A8 . 50 push eax ; |hFile
004010A9 . E8 2F020000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile
004010AE . 85C0 test eax,eax
004010B0 . 75 02 jnz short 004010B4
004010B2 . EB 43 jmp short 004010F7
004010B4 > 33DB xor ebx,ebx
004010B6 . 33F6 xor esi,esi
004010B8 . 833D 73214000>cmp dword ptr ds:[402173],10
004010BF . 7C 36 jl short 004010F7
  • KeyFile.dat編輯輸入AAAAAAAAAAAAAAAAAAAA (故意填寫20個)
  • 成功繼續向下執行了
  • 當前 ebx = 00000000
    0040211A = 0040211A (ASCII “AAAAAAAAAAAAAAAAAAAA”)
  • mov al,byte ptr ds:[ebx+40211A]這句表示每次拿0040211A裡面的一個字元,然後根據ebx增加偏移量,也就是每次迴圈一次就往後拿一個字元
  • cmp al,0je 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
2
3
4
5
6
7
8
9
10
11
004010C1   > /8A83 1A214000 mov al,byte ptr ds:[ebx+40211A]
004010C7 . |3C 00 cmp al,0
004010C9 . |74 08 je short 004010D3
004010CB . |3C 47 cmp al,47
004010CD . |75 01 jnz short 004010D0
004010CF . |46 inc esi
004010D0 > |43 inc ebx
004010D1 .^\EB EE jmp short 004010C1
004010D3 > 83FE 08 cmp esi,8
004010D6 . 7C 1F jl short 004010F7
004010D8 . E9 28010000 jmp 00401205

綜合以上的序號條件

  • 必須要有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 使用笔记 (三)