160 CrackMe 003
本帖最后由 Teak 于 2019-3-30 20:40 编辑160Crackme之003
1. F9 运行,然后输入账户和密码1111112345 ,如下图所示
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”关键汇编代码如下:
004081E3 .FF15 18B14000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>;msvbvm50.__vbaHresultCheckObj
004081E9 >8B95 50FFFFFF mov edx,dword ptr ss:
004081EF .8B45 E4 mov eax,dword ptr ss: ;eax=1622cc ="11111"
004081F2 .50 push eax ; /String = "11111"
004081F3 .8B1A mov ebx,dword ptr ds: ; |
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: ;ecx=163224 ="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 ="444489" \call的作用,16进制转10进制
00408227 .8D4D E0 lea ecx,dword ptr ss:
0040822A .FF15 94B14000 call dword ptr ds:[<&MSVBVM50.__vbaStrMo>;msvbvm50.__vbaStrMove
核心:s1=len(str)*0x15b38+ord(str)
2)从“444489”到“444491”汇编代码如下:
浮点数这一块我有点薄弱,边查指令边学
004082E6 .52 push edx ;edx=1622f4 =“444489”
004082E7 .8B19 mov ebx,dword ptr ds:
004082E9 .FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>;msvbvm50.__vbaR8Str
004082EF .D905 08104000 fld dword ptr ds: ;=41200000 \call的作用是将444489变为浮点数444489.00000000000000
004082F5 .833D 00904000>cmp dword ptr ds:,0x0 ;fld指令的意思是入ST0寄存器,4200000转化为浮点数10.0
004082FC .75 08 jnz short AfKayAs_.00408306
004082FE .D835 0C104000 fdiv dword ptr ds: ;浮点数操作10.0/浮点数5.0=2.0
00408304 .EB 0B jmp short AfKayAs_.00408311
00408306 >FF35 0C104000 push dword ptr ds:
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”汇编代码如下:
004083F2 .52 push edx ;="444491"
004083F3 .8B19 mov ebx,dword ptr ds:
004083F5 .FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>;msvbvm50.__vbaR8Str
004083FB .DC0D 10104000 fmul qword ptr ds: ;444491.0*3.0=1333473.0
00408401 .83EC 08 sub esp,0x8
00408404 .DC25 18104000 fsub qword ptr ds: ;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: ;将1333471(st0)放入esp指向的地址
00408417 .FF15 48B14000 call dword ptr ds:[<&MSVBVM50.__vbaStrR8>;msvbvm50.__vbaStrR8
0040841D .8BD0 mov edx,eax ;="1333471"
核心:s3=s2*3.0-2.0
4)最后一步,从“1333471” 到“1333486”的汇编代码如下:
004084DC .52 push edx ;="1333471"
004084DD .8B19 mov ebx,dword ptr ds:
004084DF .FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>;msvbvm50.__vbaR8Str
004084E5 .DC25 20104000 fsub qword ptr ds: ;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)
s2=s1+10.0/5.0
s3=s2*3.0-2.0
s4=s3-(-15)
print("密码是%d"%s4)
上述若有不到之处,望指正 本帖最后由 灿若星辰 于 2019-3-4 21:07 编辑
看不懂,好像很厉害的样子 灿若星辰 发表于 2019-3-4 21:04
看不懂,好像很厉害的样子
一点都不难,你仔细去调试一下,这里面其实就是涉及到浮点计算的汇编命令,但是我不熟,花的时间有点长:rggrg 很厉害的样子 感谢分享 我也在学,没有你那么厉害,谢谢指导! zj1977lsz 发表于 2019-3-5 15:46
我也在学,没有你那么厉害,谢谢指导!
没你说的这么夸张,互相学习而已:keai 看看 学习下。 @Teak 代码可以用代码框处理一下会好看很多。 Hmily 发表于 2019-3-22 18:23
@Teak 代码可以用代码框处理一下会好看很多。
回头我试试看,这段时间护网有点忙
页:
[1]