好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 Poner 于 2017-10-13 14:27 编辑
之前看到论坛里有人分享这个站点的破解文章,感觉挺好玩,所以也注册了一个,玩了一下,现在只搞定了几个简单的,目前,820分,有空就玩一下!
网站有人发过,我再发一下:http://reversing.kr/challenge.php,这应该不违规吧!不算广告吧!!
这次分享的是里面的replace 这个,以下是代码分析,加了很多注释!
[Asm] 纯文本查看 复制代码
00401020 . 55 push ebp
00401021 . 8BEC mov ebp, esp
00401023 . 817D 0C 11010>cmp dword ptr [ebp+C], 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 [ebp+10]
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 [ebp+8]
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 [4084D0], 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 [ebp+8] ; 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
[Asm] 纯文本查看 复制代码
0040466F $ E8 06000000 call Replace.0040467A
00404674 81 db 81 ; //现在是这样的,这个是OD的分析有问题,因为加了花,我们右键,删除这句的分析
00404675 . 05 D0844000 add eax, Replace.004084D0
0040467A . C705 16604000>mov dword ptr [406016], 619060EB ; //F7过来到这里,看到上面的404674这句了吧,这里显示是,DB 81
00404684 . E8 00000000 call Replace.00404689
00404689 /$ FF05 D0844000 inc dword ptr [4084D0]
0040468F \. C3 retn
00404690 > A1 D0844000 mov eax, dword ptr [4084D0]
00404695 . 68 9F464000 push Replace.0040469F
0040469A . E8 EAFFFFFF call Replace.00404689
0040469F . C705 6F464000>mov dword ptr [40466F], C39000C6
004046A9 . E8 C1FFFFFF call Replace.0040466F
004046AE . 40 inc eax
004046AF . E8 BBFFFFFF call Replace.0040466F
004046B4 . C705 6F464000>mov dword ptr [40466F], 6E8
004046BE . 58 pop eax
004046BF . B8 FFFFFFFF mov eax, -1
004046C4 .^ E9 A8C9FFFF jmp Replace.00401071
[Asm] 纯文本查看 复制代码
//然后我们看到的就是这样的代码了,他把我们输入的值加上了,0x601605c7
00404674 8105 D0844000 C>add dword ptr [4084D0], 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 [4084D0] //这里是把计算后的再加1
0040468F C3 retn
00404690 A1 D0844000 mov eax, dword ptr [4084D0]
00404695 68 9F464000 push Replace.0040469F
0040469A E8 EAFFFFFF call Replace.00404689
0040469F C705 6F464000 C>mov dword ptr [40466F], C39000C6 //这里也是个重点,改变40466f的代码了
004046A9 E8 C1FFFFFF call Replace.0040466F
004046AE 40 inc eax //这里加1也就是执行两次mov [eax],90,这也告诉我们,他要修改的地方是两个字节,正是,401071
004046AF E8 BBFFFFFF call Replace.0040466F
004046B4 C705 6F464000 E>mov dword ptr [40466F], 6E8 //这句就是还原,其实没啥用
004046BE 58 pop eax
004046BF B8 FFFFFFFF mov eax, -1
004046C4 ^ E9 A8C9FFFF jmp Replace.00401071//最后跳向401071,因为原来的JMP被NOP掉,所以直接显示成功的提示
[Asm] 纯文本查看 复制代码
//40469f的代码,执行后是下面的效果
0040466F /$ C600 90 mov byte ptr [eax], 90 //90就是NOP,应该都知道
//根具上面的分析,我们要NOP的就是401071,让那个JMP失效
00404672 \. C3 retn
算法总结:
整个算法就是利用了无符号数的溢出,无符号最大值是0~4294967295,我们输入一个数,这个数加上0x601605c7时,会超过这个最大值,超出的值再经过3次+1操做,最终是0x401071
写的很乱,不过应该是说清楚了,这个值是多少,自己计算一下吧
语文学的不好.写的很乱,请谅解,第一次在吾爱发破文,写的不好,请大家不要喷,谢谢!网站上有些CM还是不算难的,因为我也不是什么高手,有空的时候,可以玩一下! |
免费评分
-
查看全部评分
|