wgz001 发表于 2015-4-16 12:01:39

转自看雪-------放个CrackMe给新手玩玩

*****************************************
题目来源:xxxx大学首届CTF大赛逆向工程的题
题目难度:简单,三无产品
*****************************************
转自看雪   搞定的写个分析吧谢谢

飘云 发表于 2015-4-16 12:38:58

提示一下:

XOR BYTE PTR DS:,0x6E
.
.
.
.
XOR BYTE PTR DS:,0x6E

CMP ECX,0x14 // 注册码共0x14位

// 练习算法的童鞋根据上面说明,继续,还玩不转就恶补汇编指令了。。

SN:nctf{********()


int main(int, char **, char **)
{
        // xor table
        unsigned char MyArray = {0x6E,0x62,0x76,0x65,0x7F,0x49,0x36,0x4B,0x57,0x79,0x6F,0x65,0x78,0x3E,0x51,0x44,0x79,0x20,0x23,0x6E};

        for (int i = 0; i < 0x14; i++)
                printf("%c", MyArray^i);
        printf("\n");
        return 1;
}


Dxer 发表于 2015-4-16 13:34:19

飘云 发表于 2015-4-16 12:38
提示一下:

XOR BYTE PTR DS:,0x6E


飘哥太给力了。直接上注册机源码了

tree_fly 发表于 2015-4-16 22:18:28

基友,行动起来吧{:soso_e128:}

路障1:


这里是个有限循环,小兄弟有没有被搞基?
跳过或者修改循环变量,另存为新文件



路障2:


这里有个全局变量,下个硬件断点,来到这里,OD不能有效分析了,看来是人为因素修改二进制代码了。


尝试删除分析:


单步跟进:


哎呦,看到了关键信息。

可是 XOR BYTE PTR DS:, ?? 这行代码哪去了?
这里,局部代码模块化很强,应该是个循环,大胆尝试修改如下2个字节:
40143D,40144B


好了,看到我们要的数据了。

算法,见老飘贴的代码。

wgz001 发表于 2015-4-17 17:48:13

本帖最后由 wgz001 于 2015-4-17 17:54 编辑

感谢楼上各位的分析   我看了后也总结了一下不知道对不

OD载入后 bp MessageBoxAF9运行后,ALT+F9返回,出现消息框后点确定,中断在程序中
00405B6B|.8945 E4       MOV   DWORD PTR SS:, EAX
00405B6E|.C745 FC FEFFF>MOV   DWORD PTR SS:, -0x2
00405B75|.E8 0B000000   CALL    00405B85                         ;错误检测
00405B7A|.8B45 E4       MOV   EAX, DWORD PTR SS:
00405B7D|>E8 5FB40100   CALL    00420FE1                         ;2015_nct.00420FE1
00405B82\.C3            RETN



00420FE1这个call修改了返回地址,不知道是怎么回事,继续往下走会来到这里,
004012FB   > \BE 00010000   MOV   ESI, 0x100
00401300   >6A 00         PUSH    0x0
00401302   .6A 00         PUSH    0x0
00401304   .68 70894300   PUSH    0x438970                         ;小兄弟,搞基吗?
00401309   .E8 F84A0000   CALL    00405E06                         ;2015_nct.00405E06
0040130E   .83EE 01       SUB   ESI, 0x1                         ;来到这里
00401311   .^ 75 ED         JNZ   SHORT 00401300                   ;2015_nct.00401300
00401313   .5F            POP   EDI
00401314   .8D46 01       LEA   EAX, DWORD PTR DS:
00401317   .5E            POP   ESI
00401318   .C3            RETN


此时ESI=0X100 也就在一个循环的次数,看来搞基0x100次后会有结果啊{:soso_e113:},正如大大说的一样,这里可以跳转后,F9出现另外一个画面,下断点,bp GetDlgItemTextA,输入假码"1234567890",点确定,中断后返回,
0040B471|.5D            POP   EBP                              ;0012F82C
0040B472|.C2 0C00       RETN    0xC
0040B475|>8B49 4C       MOV   ECX, DWORD PTR DS:
0040B478|.8B01          MOV   EAX, DWORD PTR DS:
0040B47A|.5D            POP   EBP
0040B47B\.FF60 7C       JMP   NEAR DWORD PTR DS:

此时一路F7,代码做了很多变形,不知道是怎么变的啊,
0040141F    A1 3C524400   MOV   EAX, DWORD PTR DS:   ; 注册码的地址
00401424    51            PUSH    ECX
00401425    52            PUSH    EDX
00401426    53            PUSH    EBX
00401427    E8 00000000   CALL    0040142C                         ; 2015_nct.0040142C
0040142C    5A            POP   EDX                              ; 下面几句修改返回地址
0040142D    83C2 07         ADD   EDX, 0x7
00401430    52            PUSH    EDX
00401431    C3            RETN


再往下面走,会看到很多变形的代码
00401441    8030 6E         XOR   BYTE PTR DS:, 0x6E
00401444    51            PUSH    ECX
00401445    52            PUSH    EDX
00401446    53            PUSH    EBX
00401447    33DB            XOR   EBX, EBX
00401449    74 01         JE      SHORT 0040144C                   ; 2015_nct.0040144C
0040144B- E9 5B5A5980   JMP   80996EAB
00401450    70 01         JO      SHORT 00401453                   ; 2015_nct.00401453
00401452    6251 52         BOUND   EDX, QWORD PTR DS:
00401455    53            PUSH    EBX
00401456    33DB            XOR   EBX, EBX
00401458    74 01         JE      SHORT 0040145B                   ; 2015_nct.0040145B
0040145A    59            POP   ECX
0040145B    5B            POP   EBX
0040145C    5A            POP   EDX
0040145D    59            POP   ECX
0040145E    8070 02 76      XOR   BYTE PTR DS:, 0x76
00401462    51            PUSH    ECX
00401463    52            PUSH    EDX
00401464    53            PUSH    EBX
00401465    33DB            XOR   EBX, EBX
00401467    74 01         JE      SHORT 0040146A                   ; 2015_nct.0040146A
00401469    50            PUSH    EAX
0040146A    5B            POP   EBX
0040146B    5A            POP   EDX
0040146C    59            POP   ECX
0040146D    8070 03 65      XOR   BYTE PTR DS:, 0x65
00401471    51            PUSH    ECX

      XOR   BYTE PTR DS:, 0x6E-------这样的代码就是在解密注册码,其中好多指令被修改成如E9 5B 5A 59 80,第一个字节被改成了E9,这个就是花指令么,E9改成59或58后代码还原了,谢谢大大们的指点,不修改也可以调试,不影响,走到下面算法的位置处
0040156C    8B0D 3C524400   MOV   ECX, DWORD PTR DS:
00401572    0FB611          MOVZX   EDX, BYTE PTR DS:         ; 取注册码解密后的第一位----EDX中
00401575    85D2            TEST    EDX, EDX
00401577    75 4A         JNZ   SHORT 004015C3                   ; 2015_nct.004015C3
00401579    C645 FF 00      MOV   BYTE PTR SS:, 0x0
0040157D    EB 08         JMP   SHORT 00401587                   ; 2015_nct.00401587
0040157F    8A45 FF         MOV   AL, BYTE PTR SS:      ; 注册码的位数------>AL
00401582    04 01         ADD   AL, 0x1                        ; 下一位
00401584    8845 FF         MOV   BYTE PTR SS:, AL
00401587    0FB64D FF       MOVZX   ECX, BYTE PTR SS:       ; EBP-1中保存注册码位数
0040158B    83F9 14         CMP   ECX, 0x14                        ; 是否20位全部取完
0040158E    7D 33         JGE   SHORT 004015C3                   ; 2015_nct.004015C3
00401590    0FB655 FF       MOVZX   EDX, BYTE PTR SS:       ; 注册码的位数保存---->EDX
00401594    0FB645 FF       MOVZX   EAX, BYTE PTR SS:
00401598    8B0D 3C524400   MOV   ECX, DWORD PTR DS:
0040159E    0FB60401      MOVZX   EAX, BYTE PTR DS:       ; 取注册码解密后的第EAX位----->EAX
004015A2    3BD0            CMP   EDX, EAX                         ; 比较解密后的该位的值与对应的位数是否相等
004015A4    75 19         JNZ   SHORT 004015BF                   ; 2015_nct.004015BF
004015A6    0FB64D FF       MOVZX   ECX, BYTE PTR SS:       ; 位数----ECX中
004015AA    83F9 13         CMP   ECX, 0x13                        ; 是否比较结束
004015AD    75 0E         JNZ   SHORT 004015BD                   ; 2015_nct.004015BD
004015AF    6A 00         PUSH    0x0
004015B1    6A 00         PUSH    0x0
004015B3    68 84894300   PUSH    0x438984                         ; success!

好多的代码不知道怎么变形来的{:soso_e154:},这个大大们再指点下呗
再次感谢各位大大们的指点,小菜菜一步一步往前爬{:soso_e182:}






页: [1]
查看完整版本: 转自看雪-------放个CrackMe给新手玩玩