Whale CTF r100(defcamp)

    這幾天在作Whale CTF的基礎題目,練手試着加強人肉反編譯的能力~~~數組

    看到關鍵處以下兩段代碼,嘗試把它們翻譯一下...學習

/***********************************************************/
mov     ecx, [rbp+var_24]               ;[rbp+var_24]爲index
mov     edx, 55555556h
mov     eax, ecx
imul    edx
mov     eax, ecx
sar     eax, 1Fh
sub     edx, eax
mov     eax, edx
add     eax, eax
add     eax, edx
sub     ecx, eax
mov     edx, ecx
movsxd  rax, edx
mov     rsi, [rbp+rax*8+var_20]        ;[rbp+var_20]爲數組起始地址,每一個元素大小爲8 bytes


/************************************************************/
mov     ecx, [rbp+var_24]              ;[rbp+var_24]爲數組起始地址,每一個元素大小爲1 byte
mov     edx, 55555556h
mov     eax, ecx
imul    edx
mov     eax, ecx
sar     eax, 1Fh
sub     edx, eax
mov     eax, edx
add     eax, eax
cdqe
add     rax, rsi
movzx   eax, byte ptr [rax]
movsx   edx, al
  1. 第一段代碼大致就是,edx=high(index*0x55555556); eax=index>>31; rax=index-(edx-eax)*3。由於index大部分時間內都是小於0x80000000,因此index>>31基本爲0,公式最終變化爲index-high(index*0x55555556)*3,這也就是x-r*y的模式,大膽推測它爲x%y(當且僅當r=x/y),此處也就是high(index*0x55555556)=index/3。推導下,                            index/3=(index*2^n)/(3*2^n)    =》   index/3=index*(2^n/3)*(1/2^n);high(index*0x55555556)=index*0x55555556*(1/2^32);最終推出0x55555556=2^32/3。代碼驗證一下2^32/0x55555556=2.99999=3.0
  2. 第二段代碼幾乎和第一段代碼同樣,edx=high(index*0x55555556); eax=index>>31,rax=(edx-eax)*2,有第一段的分析可知,index>>31基本爲0,high(index*0x55555556)=index/3,因此最終公式爲index/3*2
  3. 回到IDA分析中,用F5大法正確驗證一下,                                  果真沒錯,i%3和2*(i/3),與咱們分析得如出一轍,只是index換作了i。

    這種題目,要是以往我就直接F5大法解決了,確實F5很快很便捷,同時Whale CTF視頻教程中用的是符號執行的方法。雖然這兩種方法都能解決,可是我以爲過於粗暴,逆向工程的根本功底之一就是強大的彙編閱讀能力,而此時處於學習階段的咱們,更要注重基本功的培養。因此在初次解決問題的時候,咱們應該儘可能用眼睛和腦子去調試靜態反彙編出來的彙編代碼,在腦子裏將代碼不斷抽象,最終獲得正確的關鍵邏輯。若是腦子不夠用,但又要解決問題,此時咱們再動用IDA F5和符號執行也不遲...翻譯

相關文章
相關標籤/搜索