能力值:
( LV3,RANK:30 )
|
-
-
13 楼
00401430 > 837D F4 06 CMP DWORD PTR SS:[EBP-C], 6;SS:[EBP-C]初始值是0,与6比较
00401434 . 7E 0A JLE SHORT crackme.00401440 ;小于等于6跳转后继续循环
00401436 . E9 C5000000 JMP crackme.00401500 ;否则跳到 00401500,既跳出循环
0040143B 90 NOP
0040143C 8D7426 00 LEA ESI, DWORD PTR DS:[ESI]
00401440 > 8B45 0C MOV EAX, DWORD PTR SS:[EBP+C] ;name中输入的字符串地址
00401443 . 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C] ;EDX=>(循环次数-1)
00401446 . 01D0 ADD EAX, EDX ;name中输入的字符串地址加上(循环次数-1)
00401448 . 8038 7A CMP BYTE PTR DS:[EAX], 7A ;取出一个字符与小写字母'z'进行判断
0040144B . 0F8F 9F000000 JG crackme.004014F0 ;大于跳走
00401451 . 8B45 0C MOV EAX, DWORD PTR SS:[EBP+C] ;如上
00401454 . 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
00401457 . 01D0 ADD EAX, EDX
00401459 . 8038 60 CMP BYTE PTR DS:[EAX], 60 ;取出一个字符与"`"进行比较,'a'是61
0040145C . 0F8E 8E000000 JLE crackme.004014F0 ;小于等于跳走
00401462 . 8B45 10 MOV EAX, DWORD PTR SS:[EBP+10] ;code中输入的字符串地址
00401465 . 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C] ;EDX=>(循环次数-1)
00401468 . 01D0 ADD EAX, EDX ;地址加上(循环次数-1)
0040146A . 8038 5A CMP BYTE PTR DS:[EAX], 5A ;取出一个字符与小写字母'Z'进行判断
0040146D . 0F8F 7D000000 JG crackme.004014F0 ;大于跳走
00401473 . 8B45 10 MOV EAX, DWORD PTR SS:[EBP+10]
00401476 . 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
00401479 . 01D0 ADD EAX, EDX
0040147B . 8038 40 CMP BYTE PTR DS:[EAX], 40 ;取出一个字符与'@ '进行判断,'A'是41
0040147E . 7E 70 JLE SHORT crackme.004014F0 ;小于等于跳走
00401480 . 8B45 10 MOV EAX, DWORD PTR SS:[EBP+10] ;code中输入的字符串地址
00401483 . 8B4D F0 MOV ECX, DWORD PTR SS:[EBP-10] ;SS:[EBP-10]初始值是1,在下面每次循环加2
00401486 . 8D1401 LEA EDX, DWORD PTR DS:[ECX+EAX] ;code中输入的字符串地址+(1,3,5,7.....)
00401489 . 0FBE02 MOVSX EAX, BYTE PTR DS:[EDX] ;取出1个字母保存到EAX
0040148C . 8B55 F0 MOV EDX, DWORD PTR SS:[EBP-10] ;EDX存放(循环次数+2).0040148F . 8B4D 10 MOV ECX, DWORD PTR SS:[EBP+10] ;code中输入的字符串地址
00401492 . 01CA ADD EDX, ECX ;code中输入的字符串地址+(1,3,5,7.....)
00401494 . 8D4A FF LEA ECX, DWORD PTR DS:[EDX-1] ;上面得到的地址-1
00401497 . 0FBE11 MOVSX EDX, BYTE PTR DS:[ECX] ;取出一个字母保存到EDX
0040149A . 29D0 SUB EAX, EDX ;得到的字母ASCII码之前相减0040149C . 3B45 F4 CMP EAX, DWORD PTR SS:[EBP-C] ;得到的结果与(循环次数-1)比较
0040149F . 75 4F JNZ SHORT crackme.004014F0 ;不相等跳到004014F0,相等继续
004014A1 . 8B45 0C MOV EAX, DWORD PTR SS:[EBP+C] ;EAX指向name中字符串地址
004014A4 . 8B4D F4 MOV ECX, DWORD PTR SS:[EBP-C] ;ECX是(循环次数-1)
004014A7 . 8D1401 LEA EDX, DWORD PTR DS:[ECX+EAX] ;name中输入的字符串地址+循环次数-1)
004014AA . 0FBE02 MOVSX EAX, BYTE PTR DS:[EDX] ;第一次循环取第一个字母,第二次循环取第二个字母.....
004014AD . 8B55 F0 MOV EDX, DWORD PTR SS:[EBP-10] ;EDX=>(1,3,5,7...)
004014B0 . 8B4D 10 MOV ECX, DWORD PTR SS:[EBP+10] ;Code中输入的字符串地址
004014B3 . 01CA ADD EDX, ECX ;code里的字符串地址+(1,3,5,7...)
004014B5 . 8D4A FF LEA ECX, DWORD PTR DS:[EDX-1];字符串地址+(1,3,5,7...)-1
004014B8 . 0FBE11 MOVSX EDX, BYTE PTR DS:[ECX] ;取出一个字母放到EDX中
004014BB . 89C1 MOV ECX, EAX ;name中得到的字母赋给ECX
004014BD . 29D1 SUB ECX, EDX ;name中输入的字母ASCII - code中输入的字母ASCII
004014BF . 894D CC MOV DWORD PTR SS:[EBP-34], ECX ;SS:[EBP-34]里存储相减结果
004014C2 . 8B55 F0 MOV EDX, DWORD PTR SS:[EBP-10] ;EDX=>(1,3,5,7...)
004014C5 . 83C2 02 ADD EDX, 2 ;EDX+2
004014C8 . BB 1D000000 MOV EBX, 1D ;1D保存到EBX
004014CD . 89D8 MOV EAX, EBX ;EAX=1D ,十进制是29
004014CF . 89D6 MOV ESI, EDX ;上面得到的EDX值保存到ESI
004014D1 . 99 CDQ
004014D2 . F7FE IDIV ESI ;EAX/ESI ,既 1D/ESI
004014D4 . 89C1 MOV ECX, EAX ;除后的商放入ECX
004014D6 . 8D59 1E LEA EBX, DWORD PTR DS:[ECX+1E] ;商+1E保存到EBX,1E十进制是30
004014D9 . 395D CC CMP DWORD PTR SS:[EBP-34], EBX ;比较是否相等
004014DC . 75 0F JNZ SHORT crackme.004014ED ;不相等跳转
004014DE . 8345 F0 02 ADD DWORD PTR SS:[EBP-10], 2 ;SS:[EBP-10]+2
004014E2 . 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004014E5 . 89C2 MOV EDX, EAX
004014E7 . 8D0412 LEA EAX, DWORD PTR DS:[EDX+EDX]
004014EA . 8945 FC MOV DWORD PTR SS:[EBP-4], EAX
004014ED > EB 05 JMP SHORT crackme.004014F4
004014EF 90 NOP
004014F0 > 8345 FC E7 ADD DWORD PTR SS:[EBP-4], -19
004014F4 > FF45 F4 INC DWORD PTR SS:[EBP-C]
004014F7 .^ E9 34FFFFFF JMP crackme.00401430
1.name中必须为5位小写字母
2.code中必须为10位大写字母
3.name中取出的i位字母ASCII - code中取出的(2*i-1)字母的ASCII = 1D/(2*x+1) + 1E
整理后为
code(2*i-1)=name(i)-1D/(2*i+1)-1E i =(1,2,3,4,5)
举例:
假如kimdh对应的16进制ASCII为 6B 69 6D 64 68 ,i每次加1
1D/(2*i+1)=1D/3=>27 6B-27=44(D) 下一个 +0=D
1D/(2*i+1)=1D/5=>23 69-23=46(F) 下一个 +1=G
1D/(2*i+1)=1D/7=>22 6D-22=4B(K) 下一个 +2=M
1D/(2*i+1)=1D/9=>21 64-21=43(C) 下一个 +3=F
1D/(2*i+1)=1D/11=>20 68-20=48(H) 下一个 +4=L
name:kimdh
code:DDFGKMCFHL
本人菜鸟,所以当做练习做了一遍。有误的地方请高手们指正。
|