本帖最后由 Teak 于 2019-3-30 20:40 编辑
160Crackme之003
1. F9 运行,然后输入账户和密码11111 12345 ,如下图所示
2. F12暂停,点击k,寻找这个弹窗的函数,如下图所示:
在rtcMsgBox的地址右键显示调用,在反汇编窗口中跟随,鼠标往上滚,如下图所示
3.鼠标继续往上走,找到push ebp的位置,然后从上到下F8大法,如下图所示:
4. 然后继续运行程序,此时在push ebp处停下,F8步过走一遍,寻找输入字符11111和12345,如下图所示:
F8的同时,注意观察堆栈窗口,看是否产生类似密钥的字符串,下图是我单步到弹窗函数的过程中发现的字符串有“11111” “444489” “444491” “1333473” “1333471” “1333486”,最终我将1333486输入到密码一栏得到正确的结果,在11111,444489,444491,1333473, 1333471,1333486生成的地址下了断点,猜测这些就是生成密码的关键位置,如下图所示,是堆栈窗口生成的密码:
5.算法分析过程 : 重点是注意堆栈窗口产生的数字及其变化,需要反复调试几次的
__vbaLenBstr:计算字符串长度
#rtcAnsiValueBstr_516:取字符串的第一个字符的ascii码
__vbaStrI4:16进制转10进制
1) 从“11111”到“444489”关键汇编代码如下:
[Asm] 纯文本查看 复制代码
004081E3 . FF15 18B14000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>; msvbvm50.__vbaHresultCheckObj
004081E9 > 8B95 50FFFFFF mov edx,dword ptr ss:[ebp-0xB0]
004081EF . 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C] ; eax=1622cc [eax]="11111"
004081F2 . 50 push eax ; /String = "11111"
004081F3 . 8B1A mov ebx,dword ptr ds:[edx] ; |
004081F5 . FF15 F8B04000 call dword ptr ds:[<&MSVBVM50.__vbaLenBs>; \__vbaLenBstr
004081FB . 8BF8 mov edi,eax ; edi=5,\call的作用是计算字符串长度
004081FD . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18] ; ecx=163224 [ecx]="11111"
00408200 . 69FF 385B0100 imul edi,edi,0x15B38 ; edi=5*0x15b38=6c818
00408206 . 51 push ecx ; /String = "?"
00408207 . 0F80 B7050000 jo AfKayAs_.004087C4 ; |
0040820D . FF15 0CB14000 call dword ptr ds:[<&MSVBVM50.#rtcAnsiVa>; \rtcAnsiValueBstr
00408213 . 0FBFD0 movsx edx,ax ; edx=31 \call的作用是提取第一个字符串的ascii码
00408216 . 03FA add edi,edx ; edi=6c818+31=6c849
00408218 . 0F80 A6050000 jo AfKayAs_.004087C4
0040821E . 57 push edi
0040821F . FF15 F4B04000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>; msvbvm50.__vbaStrI4
00408225 . 8BD0 mov edx,eax ; eax=1622F4 [eax]="444489" \call的作用,16进制转10进制
00408227 . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
0040822A . FF15 94B14000 call dword ptr ds:[<&MSVBVM50.__vbaStrMo>; msvbvm50.__vbaStrMove
核心:s1=len(str)*0x15b38+ord(str[0])
2)从“444489”到“444491”汇编代码如下:
浮点数这一块我有点薄弱,边查指令边学
[Asm] 纯文本查看 复制代码
004082E6 . 52 push edx ; edx=1622f4 [edx]=“444489”
004082E7 . 8B19 mov ebx,dword ptr ds:[ecx]
004082E9 . FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>; msvbvm50.__vbaR8Str
004082EF . D905 08104000 fld dword ptr ds:[0x401008] ; [0x401008]=41200000 \call的作用是将444489变为浮点数444489.00000000000000
004082F5 . 833D 00904000>cmp dword ptr ds:[0x409000],0x0 ; fld指令的意思是入ST0寄存器,4200000转化为浮点数10.0
004082FC . 75 08 jnz short AfKayAs_.00408306
004082FE . D835 0C104000 fdiv dword ptr ds:[0x40100C] ; 浮点数操作10.0/浮点数5.0=2.0
00408304 . EB 0B jmp short AfKayAs_.00408311
00408306 > FF35 0C104000 push dword ptr ds:[0x40100C]
0040830C . E8 578DFFFF call <jmp.&MSVBVM50._adj_fdiv_m32>
00408311 > 83EC 08 sub esp,0x8 ; esp=12f3e8
00408314 . DFE0 fstsw ax ; eax=3100 注意观察FPU寄存器
00408316 . A8 0D test al,0xD
00408318 . 0F85 A1040000 jnz AfKayAs_.004087BF
0040831E . DEC1 faddp st(1),st ; ST0=ST1+ST0=444489.0+2.0=444491.0
00408320 . DFE0 fstsw ax
00408322 . A8 0D test al,0xD ; 测第13位是否为1
核心:s2=s1+10.0/5.0
3)从“444491” 到“1333473”到“1333471”汇编代码如下:
[Asm] 纯文本查看 复制代码
004083F2 . 52 push edx ; [edx]="444491"
004083F3 . 8B19 mov ebx,dword ptr ds:[ecx]
004083F5 . FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>; msvbvm50.__vbaR8Str
004083FB . DC0D 10104000 fmul qword ptr ds:[0x401010] ; 444491.0*3.0=1333473.0
00408401 . 83EC 08 sub esp,0x8
00408404 . DC25 18104000 fsub qword ptr ds:[0x401018] ; 1333473.0-2.0=1333471.0
0040840A . DFE0 fstsw ax ; ax=3900
0040840C . A8 0D test al,0xD
0040840E . 0F85 AB030000 jnz AfKayAs_.004087BF
00408414 . DD1C24 fstp qword ptr ss:[esp] ; 将1333471(st0)放入esp指向的地址
00408417 . FF15 48B14000 call dword ptr ds:[<&MSVBVM50.__vbaStrR8>; msvbvm50.__vbaStrR8
0040841D . 8BD0 mov edx,eax ; [edx]="1333471"
核心:s3=s2*3.0-2.0
4)最后一步,从“1333471” 到“1333486”的汇编代码如下:
[Asm] 纯文本查看 复制代码
004084DC . 52 push edx ; [edx]="1333471"
004084DD . 8B19 mov ebx,dword ptr ds:[ecx]
004084DF . FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>; msvbvm50.__vbaR8Str
004084E5 . DC25 20104000 fsub qword ptr ds:[0x401020] ; ST0=1333471-(-15)=1333486.0
004084EB . 83EC 08 sub esp,0x8
004084EE . DFE0 fstsw ax ; ax=3900
004084F0 . A8 0D test al,0xD
核心:s4=s3-(-15)
Py3:
代码的运行流程如下:
str=input("请随便输入一个账户,如11111:")
s1=len(str)*0x15b38+ord(str[0])
s2=s1+10.0/5.0
s3=s2*3.0-2.0
s4=s3-(-15)
print("密码是%d"%s4)
上述若有不到之处,望指正 |