CrackMe练习——Afkayas.1

Posted roachs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CrackMe练习——Afkayas.1相关的知识,希望对你有一定的参考价值。

前言

第2个练习CrackMe。

准备

  • 系统:Windows 7 SP1 x64 ultimate

  • 工具:PEiD、OllyDbg

分析

拖入PEiD查壳,无壳,而且是VB写的。

运行程序。

技术分享图片

用户名输入、序列号输入。

随意输入,看错误提示。

技术分享图片

错误字符串You Get Wrong Try Again

载入OD,搜索字符串便可以看到错误提示。

双击定位,在该地址上面还可以看到You Get It,看意思是正确的意思。

00402588   .  8945 B4       mov dword ptr ss:[ebp-0x4C],eax          ;  kernel32.BaseThreadInitThunk
0040258B   .  74 58         je short Afkayas_.004025E5
0040258D   .  68 801B4000   push Afkayas_.00401B80                   ;  You Get It
00402592   .  68 9C1B4000   push Afkayas_.00401B9C                   ;  

00402597   .  FFD7          call edi
00402599   .  8BD0          mov edx,eax                              ;  kernel32.BaseThreadInitThunk
0040259B   .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
0040259E   .  FFD3          call ebx
004025A0   .  50            push eax                                 ;  kernel32.BaseThreadInitThunk
004025A1   .  68 A81B4000   push Afkayas_.00401BA8                   ;  KeyGen It Now
004025A6   .  FFD7          call edi
004025A8   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
004025AB   .  8945 CC       mov dword ptr ss:[ebp-0x34],eax          ;  kernel32.BaseThreadInitThunk
004025AE   .  8D55 A4       lea edx,dword ptr ss:[ebp-0x5C]
004025B1   .  51            push ecx
004025B2   .  8D45 B4       lea eax,dword ptr ss:[ebp-0x4C]
004025B5   .  52            push edx                                 ;  Afkayas_.<ModuleEntryPoint>
004025B6   .  50            push eax                                 ;  kernel32.BaseThreadInitThunk
004025B7   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
004025BA   .  6A 00         push 0x0
004025BC   .  51            push ecx
004025BD   .  C745 C4 08000>mov dword ptr ss:[ebp-0x3C],0x8
004025C4   .  FF15 10414000 call dword ptr ds:[<&MSVBVM50.#rtcMsgBox>;  msvbvm50.rtcMsgBox
004025CA   .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
004025CD   .  FF15 80414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>;  msvbvm50.__vbaFreeStr
004025D3   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
004025D6   .  8D45 A4       lea eax,dword ptr ss:[ebp-0x5C]
004025D9   .  52            push edx                                 ;  Afkayas_.<ModuleEntryPoint>
004025DA   .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
004025DD   .  50            push eax                                 ;  kernel32.BaseThreadInitThunk
004025DE   .  8D55 C4       lea edx,dword ptr ss:[ebp-0x3C]
004025E1   .  51            push ecx
004025E2   .  52            push edx                                 ;  Afkayas_.<ModuleEntryPoint>
004025E3   .  EB 56         jmp short Afkayas_.0040263B
004025E5   >  68 C81B4000   push Afkayas_.00401BC8                   ;  You Get Wrong
004025EA   .  68 9C1B4000   push Afkayas_.00401B9C                   ;  

004025EF   .  FFD7          call edi

那么je就是我们要找的跳转指令了。

然后就要找影响标志的指令了。

向上翻,可以看到test指令,就是它没错了。

00402569   .  83C4 0C       add esp,0xC
0040256C   .  B9 04000280   mov ecx,0x80020004
00402571   .  B8 0A000000   mov eax,0xA
00402576   .  894D 9C       mov dword ptr ss:[ebp-0x64],ecx
00402579   .  66:85F6       test si,si
0040257C   .  8945 94       mov dword ptr ss:[ebp-0x6C],eax          ;  kernel32.BaseThreadInitThunk
0040257F   .  894D AC       mov dword ptr ss:[ebp-0x54],ecx
00402582   .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax          ;  kernel32.BaseThreadInitThunk
00402585   .  894D BC       mov dword ptr ss:[ebp-0x44],ecx
00402588   .  8945 B4       mov dword ptr ss:[ebp-0x4C],eax          ;  kernel32.BaseThreadInitThunk
0040258B   .  74 58         je short Afkayas_.004025E5
0040258D   .  68 801B4000   push Afkayas_.00401B80                   ;  You Get It
00402592   .  68 9C1B4000   push Afkayas_.00401B9C                   ;  

00402597   .  FFD7          call edi

既然操作数是esi,那就需要看哪里修改了esi的值。

继续向上找,竟然发现了vbaStrCmp函数,跳转指令最近的比较指令,那就没跑了。

00402508   .  56            push esi
00402509   .  50            push eax
0040250A   .  FF15 04414000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>;  msvbvm50.__vbaHresultCheckObj
00402510   >  8B45 E8       mov eax,dword ptr ss:[ebp-0x18]
00402513   .  8B4D E4       mov ecx,dword ptr ss:[ebp-0x1C]
00402516   .  8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaSt>;  msvbvm50.__vbaStrCat
0040251C   .  50            push eax
0040251D   .  68 701B4000   push Afkayas_.00401B70                   ;  AKA-
00402522   .  51            push ecx                                 ; /String = "劃P"
00402523   .  FFD7          call edi                                 ; \__vbaStrCat
00402525   .  8B1D 70414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaSt>;  msvbvm50.__vbaStrMove
0040252B   .  8BD0          mov edx,eax
0040252D   .  8D4D E0       lea ecx,dword ptr ss:[ebp-0x20]
00402530   .  FFD3          call ebx                                 ;  msvbvm50.__vbaStrMove; <&MSVBVM50.__vbaStrMove>
00402532   .  50            push eax
00402533   .  FF15 28414000 call dword ptr ds:[<&MSVBVM50.__vbaStrCm>;  msvbvm50.__vbaStrCmp
00402539   .  8BF0          mov esi,eax

在0x00402533处下断,运行到此处,看下其参数。

0018F360   00509D84  UNICODE "AKA-390240"
0018F364   00509CBC  UNICODE "123456"

该函数有两个参数,从栈中可以看出分别是AKA-390240和我们输入的123456,那么AKA-390240应该就是我们要找的序列号了。

输入测试。

技术分享图片

可以看出,AKA-后面的注册码是根据用户名计算的。分析输入数据流,可以找到该算法。

00402412   .  50              push eax                                                ; /String = 00000804 ???
00402413   .  8B1A            mov ebx,dword ptr ds:[edx]                              ; |
00402415   .  FF15 E4404000   call dword ptr ds:[<&MSVBVM50.__vbaLenBstr>]            ; \__vbaLenBstr
0040241B   .  8BF8            mov edi,eax
0040241D   .  8B4D E8         mov ecx,dword ptr ss:[ebp-0x18]
00402420   .  69FF FB7C0100   imul edi,edi,0x17CFB                      ;len(name) * 0x17CFB
00402426   .  51              push ecx                                                ; /String = 00000002 ???
00402427   .  0F80 91020000   jo Afkayas_.004026BE                                    ; |
0040242D   .  FF15 F8404000   call dword ptr ds:[<&MSVBVM50.#rtcAnsiValueBstr_516>]   ; 
tcAnsiValueBstr
00402433   .  0FBFD0          movsx edx,ax
00402436   .  03FA            add edi,edx               ;len(name) * 0x17CFB + ascii(name[0])
00402438   .  0F80 80020000   jo Afkayas_.004026BE
0040243E   .  57              push edi
0040243F   .  FF15 E0404000   call dword ptr ds:[<&MSVBVM50.__vbaStrI4>]              ;  msvbvm50.__vbaStrI4
00402445   .  8BD0            mov edx,eax

算法很简单,首先计算用户名的长度,与0x17CFB相乘,然后与用户名首字母的ascii值相加,将结果转为十进制并转为字符串类型。

比如:

用户名:test,长度为4。所以就是4 * 0x17CFB + 0x74,结果为0x5F460,转为十进制为390240,那么注册码就是AKA-390240了。

参考

以上是关于CrackMe练习——Afkayas.1的主要内容,如果未能解决你的问题,请参考以下文章

逆向工程实战--Afkayas.1

[CRC32算法练习] CRC32CrackMe算法分析

CrackMe练习——Acid_burn

[MD5算法练习] MD5CrackMe算法分析

一个crackme的分析

看雪CTF2016CrackMe攻防大赛——第一题