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和符号执行也不迟...翻译

相关文章
相关标签/搜索