gunxsword 发表于 2017-10-13 12:58

reversing.kr 上面一个CM的简单分析,replace.exe

本帖最后由 Poner 于 2017-10-13 14:27 编辑

之前看到论坛里有人分享这个站点的破解文章,感觉挺好玩,所以也注册了一个,玩了一下,现在只搞定了几个简单的,目前,820分,有空就玩一下!

网站有人发过,我再发一下:http://reversing.kr/challenge.php,这应该不违规吧!不算广告吧!!

这次分享的是里面的replace 这个,以下是代码分析,加了很多注释!


00401020   .55            push    ebp
00401021   .8BEC          mov   ebp, esp
00401023   .817D 0C 11010>cmp   dword ptr , 111
0040102A   .74 06         je      short Replace.00401032
0040102C   .33C0          xor   eax, eax
0040102E   .5D            pop   ebp
0040102F   .C2 1000       retn    10
00401032   >8B45 10       mov   eax, dword ptr
00401035   .25 FFFF0000   and   eax, 0FFFF
0040103A   .83E8 02       sub   eax, 2                           ;Switch (cases 2..3EB)
0040103D   .74 56         je      short Replace.00401095
0040103F   .2D E9030000   sub   eax, 3E9
00401044   .74 06         je      short Replace.0040104C
00401046   .33C0          xor   eax, eax                         ;Default case of switch 0040103A
00401048   .5D            pop   ebp
00401049   .C2 1000       retn    10
0040104C   >56            push    esi                              ;Case 3EB of switch 0040103A
0040104D   .8B75 08       mov   esi, dword ptr
00401050   .6A 00         push    0                              ; /IsSigned = FALSE
00401052   .6A 00         push    0                              ; |pSuccess = NULL
00401054   .68 EA030000   push    3EA                              ; |ControlID = 3EA (1002.)
00401059   .56            push    esi                              ; |hWnd
0040105A   .FF15 9C504000 call    dword ptr [<&USER32.GetDlgItemIn>; \GetDlgItemInt
00401060   .A3 D0844000   mov   dword ptr , eax          ;//取得一个无符号整型数值,也就是我们输入的是一个无符号整数
00401065   .E8 05360000   call    Replace.0040466F               ;//F7跟踪进入
0040106A   .33C0          xor   eax, eax
0040106C   .E9 1F360000   jmp   Replace.00404690
00401071   >EB 11         jmp   short Replace.00401084         ;//我们输入的整数经过代码转换处理,最终代码会把这个401071给NOP掉,这样才能出现正确的弹窗
00401073   .68 34 60 40 0>ascii   "h4`@",0                         ;Correct!   ///通过查找这个字符串可以定位到这里
00401078   .68 E9030000   push    3E9                              ; |ControlID = 3E9 (1001.)
0040107D   .56            push    esi                              ; |hWnd
0040107E   .FF15 A0504000 call    dword ptr [<&USER32.SetDlgItemTe>; \SetDlgItemTextA
00401084   >B8 01000000   mov   eax, 1
00401089   .90            nop
0040108A   .90            nop
0040108B   .90            nop
0040108C   .90            nop
0040108D   .90            nop
0040108E   .90            nop
0040108F   .90            nop
00401090   .5E            pop   esi
00401091   .5D            pop   ebp
00401092   .C2 1000       retn    10
00401095   >8B45 08       mov   eax, dword ptr          ;Case 2 of switch 0040103A
00401098   .6A 02         push    2                              ; /Result = 2
0040109A   .50            push    eax                              ; |hWnd
0040109B   .FF15 A4504000 call    dword ptr [<&USER32.EndDialog>]; \EndDialog
004010A1   .B8 01000000   mov   eax, 1
004010A6   .5D            pop   ebp
004010A7   .C2 1000       retn    10


0040466F   $E8 06000000   call    Replace.0040467A
00404674      81            db      81                               ;//现在是这样的,这个是OD的分析有问题,因为加了花,我们右键,删除这句的分析
00404675   .05 D0844000   add   eax, Replace.004084D0
0040467A   .C705 16604000>mov   dword ptr , 619060EB   ;//F7过来到这里,看到上面的404674这句了吧,这里显示是,DB 81
00404684   .E8 00000000   call    Replace.00404689
00404689/$FF05 D0844000 inc   dword ptr
0040468F\.C3            retn
00404690   >A1 D0844000   mov   eax, dword ptr
00404695   .68 9F464000   push    Replace.0040469F
0040469A   .E8 EAFFFFFF   call    Replace.00404689
0040469F   .C705 6F464000>mov   dword ptr , C39000C6
004046A9   .E8 C1FFFFFF   call    Replace.0040466F
004046AE   .40            inc   eax
004046AF   .E8 BBFFFFFF   call    Replace.0040466F
004046B4   .C705 6F464000>mov   dword ptr , 6E8
004046BE   .58            pop   eax
004046BF   .B8 FFFFFFFF   mov   eax, -1
004046C4   .^ E9 A8C9FFFF   jmp   Replace.00401071



//然后我们看到的就是这样的代码了,他把我们输入的值加上了,0x601605c7
00404674    8105 D0844000 C>add   dword ptr , 601605C7   ;
0040467E    40            inc   eax    //下面几句是花指令,不用管,往下执行
0040467F    00EB            add   bl, ch
00404681    60            pushad
00404682    90            nop
00404683    61            popad
00404684    E8 00000000   call    Replace.00404689
00404689    FF05 D0844000   inc   dword ptr //这里是把计算后的再加1
0040468F    C3            retn
00404690    A1 D0844000   mov   eax, dword ptr
00404695    68 9F464000   push    Replace.0040469F
0040469A    E8 EAFFFFFF   call    Replace.00404689
0040469F    C705 6F464000 C>mov   dword ptr , C39000C6//这里也是个重点,改变40466f的代码了
004046A9    E8 C1FFFFFF   call    Replace.0040466F
004046AE    40            inc   eax   //这里加1也就是执行两次mov ,90,这也告诉我们,他要修改的地方是两个字节,正是,401071
004046AF    E8 BBFFFFFF   call    Replace.0040466F
004046B4    C705 6F464000 E>mov   dword ptr , 6E8//这句就是还原,其实没啥用
004046BE    58            pop   eax
004046BF    B8 FFFFFFFF   mov   eax, -1
004046C4^ E9 A8C9FFFF   jmp   Replace.00401071//最后跳向401071,因为原来的JMP被NOP掉,所以直接显示成功的提示



//40469f的代码,执行后是下面的效果
0040466F/$C600 90       mov   byte ptr , 90//90就是NOP,应该都知道
//根具上面的分析,我们要NOP的就是401071,让那个JMP失效
00404672\.C3            retn


算法总结:

整个算法就是利用了无符号数的溢出,无符号最大值是0~4294967295,我们输入一个数,这个数加上0x601605c7时,会超过这个最大值,超出的值再经过3次+1操做,最终是0x401071

写的很乱,不过应该是说清楚了,这个值是多少,自己计算一下吧

语文学的不好.写的很乱,请谅解,第一次在吾爱发破文,写的不好,请大家不要喷,谢谢!网站上有些CM还是不算难的,因为我也不是什么高手,有空的时候,可以玩一下!

Poner 发表于 2017-10-13 14:28

帮你编辑了一下好看多了以后发帖学着吧

任国富 发表于 2017-10-13 16:16

感谢大神分享,谢谢!

gunxsword 发表于 2017-10-13 17:24

Poner 发表于 2017-10-13 14:28
帮你编辑了一下好看多了以后发帖学着吧

历害了,真要学啊,这编辑完,好看多了,一下就高大上了,感谢!{:1_921:}

hyqwfx 发表于 2017-10-13 21:40

学习了,感谢分享

wallker1 发表于 2017-10-14 09:05

加油做的很好!!!!{:1_931:}

Ticktack 发表于 2017-10-14 18:26

学习了..

爱蜂玩爱疯玩 发表于 2017-11-16 13:25

爱蜂玩爱疯玩 发表于 2017-11-21 18:28

爱蜂玩爱疯玩 发表于 2017-11-27 15:01

页: [1]
查看完整版本: reversing.kr 上面一个CM的简单分析,replace.exe