转自看雪-------放个CrackMe给新手玩玩
*****************************************题目来源:xxxx大学首届CTF大赛逆向工程的题
题目难度:简单,三无产品
*****************************************
转自看雪 搞定的写个分析吧谢谢
提示一下:
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;
}
飘云 发表于 2015-4-16 12:38
提示一下:
XOR BYTE PTR DS:,0x6E
飘哥太给力了。直接上注册机源码了
基友,行动起来吧{:soso_e128:}
路障1:
这里是个有限循环,小兄弟有没有被搞基?
跳过或者修改循环变量,另存为新文件
路障2:
这里有个全局变量,下个硬件断点,来到这里,OD不能有效分析了,看来是人为因素修改二进制代码了。
尝试删除分析:
单步跟进:
哎呦,看到了关键信息。
可是 XOR BYTE PTR DS:, ?? 这行代码哪去了?
这里,局部代码模块化很强,应该是个循环,大胆尝试修改如下2个字节:
40143D,40144B
好了,看到我们要的数据了。
算法,见老飘贴的代码。
本帖最后由 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]