首页
社区
课程
招聘
[原创]看雪CTF 2016_第六题分析
发表于: 2016-11-12 22:11 2412

[原创]看雪CTF 2016_第六题分析

2016-11-12 22:11
2412
013DFFE0  /$  55            push ebp
013DFFE1  |.  8BEC          mov ebp,esp
013DFFE3  |.  FF75 08       push [arg.1]
013DFFE6  |.  8F45 08       pop [arg.1]
013DFFE9  |.  FF75 0C       push [arg.2]
013DFFEC  |.  8F05 2EF34201 pop dword ptr ds:[0x142F32E]
013DFFF2  |.  FF75 10       push [arg.3]
013DFFF5  |.  8F45 10       pop [arg.3]
013DFFF8  |.  FF75 14       push [arg.4]
013DFFFB  |.  8F45 14       pop [arg.4]
013DFFFE  |.  837D 10 01    cmp [arg.3],0x1
013E0002  |.  75 09         jnz short CrackMe.013E000D
013E0004  |.  C745 10 02000>mov [arg.3],0x2
013E000B  |.  EB 49         jmp short CrackMe.013E0056
013E000D  |>  837D 10 02    cmp [arg.3],0x2
013E0011  |.  75 09         jnz short CrackMe.013E001C
013E0013  |.  C745 10 04000>mov [arg.3],0x4
013E001A  |.  EB 3A         jmp short CrackMe.013E0056
013E001C  |>  837D 10 04    cmp [arg.3],0x4
013E0020  |.  75 09         jnz short CrackMe.013E002B
013E0022  |.  C745 10 01000>mov [arg.3],0x1
013E0029  |.  EB 2B         jmp short CrackMe.013E0056
013E002B  |>  837D 10 03    cmp [arg.3],0x3
013E002F  |.  75 09         jnz short CrackMe.013E003A
013E0031  |.  C745 10 06000>mov [arg.3],0x6
013E0038  |.  EB 1C         jmp short CrackMe.013E0056
013E003A  |>  837D 10 05    cmp [arg.3],0x5
013E003E  |.  75 09         jnz short CrackMe.013E0049
013E0040  |.  C745 10 03000>mov [arg.3],0x3
013E0047  |.  EB 0D         jmp short CrackMe.013E0056
013E0049  |>  837D 10 06    cmp [arg.3],0x6
013E004D  |.  75 07         jnz short CrackMe.013E0056
013E004F  |.  C745 10 05000>mov [arg.3],0x5

013E0056  |>  833D 32F34201>cmp dword ptr ds:[0x142F332],0x0
013E005D  |.  75 14         jnz short CrackMe.013E0073
013E005F  |.  68 8DFF3D01   push CrackMe.013DFF8D                    ; /NewValue =

0x13DFF8D
013E0064  |.  6A FC         push -0x4                                ; |Index = GWL_WNDPROC
013E0066  |.  FF75 08       push [arg.1]                             ; |hWnd
013E0069  |.  E8 08270000   call <jmp.&USER32.SetWindowLongA>        ; \SetWindowLongA

013E006E  |.  A3 32F34201   mov dword ptr ds:[0x142F332],eax
013E0073  |>  FF05 22F34201 inc dword ptr ds:[0x142F322]
013E0079  |.  FF05 26F34201 inc dword ptr ds:[0x142F326]
013E007F  |.  A1 26F34201   mov eax,dword ptr ds:[0x142F326]
013E0084  |.  05 E8800000   add eax,0x80E8
013E0089  |.  A3 2AF34201   mov dword ptr ds:[0x142F32A],eax
013E008E  |.  FF75 14       push [arg.4]                             ; /Key
013E0091  |.  FF75 10       push [arg.3]                             ; |Modifiers
013E0094      50            push eax
013E0095      FF75 08       push dword ptr ss:[ebp+0x8]
013E0098  |.  E8 03270000   call <jmp.&USER32.RegisterHotKey>        ; \RegisterHotKey

程序一开始弄了一个检测调试,然后弄了一个热键冲突,使在OD调试中,F8按下没反应。

SetWindowLong

0030F7AC   00130704  |hWnd = 00130704 ('CrackMe-2016',class='WTWindow')
0030F7B0   FFFFFFFC  |Index = GWL_WNDPROC
0030F7B4   003BFF8D  \NewValue = 0x3BFF8D

SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设

置在窗口的额外存储空间的指定偏移位置。

GWL_WNDPROC
-4       
为窗口过程设定一个新的地址。

RegisterHotKey

0030F7A8   00130704  |hWnd = 00130704 ('CrackMe-2016',class='WTWindow')
0030F7AC   000080E9  |HotKeyID = 0x80E9
0030F7B0   00000000  |Modifiers = 0
0030F7B4   00000077  \Key = VK_F8

注册一个HotKeyID 为0x80E9  使得按F8没反应。
013E0094      50            push eax  修改这里为push 0 即可过这个anti

然后在验证注册码过程中调用了线程

下线程断点
bp BaseThreadInitThunk

定位到线程地址 010F2313

010F2313   .  56            push esi
010F2314   .  57            push edi
010F2315   .  53            push ebx
010F2316   .  E8 64F6FFFF   call CrackMe1.010F197F
010F231B   .  5B            pop ebx
010F231C   .  5F            pop edi
010F231D   .  5E            pop esi
010F231E   .  C3            retn

我们拉倒最后一个JE跳转,这里会判断[local.11]的值是否为0

010F21DB  |.  83C4 04       add esp,0x4
010F21DE  |>  837D D4 00    cmp [local.11],0x0
010F21E2  |.  0F84 9A000000 je CrackMe1.010F2282
010F21E8  |.  6A 00         push 0x0

是的话就跳到下面这段代码,这段代码是用易语言的置入代码命令写的,可以随便写成乱码,使程序
寄存器数值错误,引发程序奔溃。

010F2282  |> \0102          add dword ptr ds:[edx],eax
010F2284  |.  030405 060708>add eax,dword ptr ds:[eax+0x9080706]
010F228B  |.  006A 00       add byte ptr ds:[edx],ch

好了,既然是对比[local.11]的值是否为0 我们向上找,找到以下代码段

010F21B8  |.  E8 25F7FFFF   call CrackMe1.010F18E2
010F21BD  |.  83C4 08       add esp,0x8
010F21C0  |.  83F8 00       cmp eax,0x0
010F21C3  |.  B8 00000000   mov eax,0x0
010F21C8  |.  0F94C0        sete al
010F21CB  |.  8945 D4       mov [local.11],eax
010F21CE  |.  8B5D D8       mov ebx,[local.10]
010F21D1  |.  85DB          test ebx,ebx

这个是经典的易语言文本对比特征,所以直接定位这里就会出现正确的注册码!
正确的注册码为:33053055C3055C2E3030553055C2

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//