Teak 发表于 2019-3-4 20:36

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:04

本帖最后由 灿若星辰 于 2019-3-4 21:07 编辑

看不懂,好像很厉害的样子

Teak 发表于 2019-3-4 21:22

灿若星辰 发表于 2019-3-4 21:04
看不懂,好像很厉害的样子

一点都不难,你仔细去调试一下,这里面其实就是涉及到浮点计算的汇编命令,但是我不熟,花的时间有点长:rggrg

wangzhenuen 发表于 2019-3-5 09:52

很厉害的样子

xwllzz77 发表于 2019-3-5 14:52

感谢分享

zj1977lsz 发表于 2019-3-5 15:46

我也在学,没有你那么厉害,谢谢指导!

Teak 发表于 2019-3-5 18:09

zj1977lsz 发表于 2019-3-5 15:46
我也在学,没有你那么厉害,谢谢指导!

没你说的这么夸张,互相学习而已:keai

埖落 发表于 2019-3-6 09:17

看看 学习下。

Hmily 发表于 2019-3-22 18:23

@Teak 代码可以用代码框处理一下会好看很多。

Teak 发表于 2019-3-24 11:52

Hmily 发表于 2019-3-22 18:23
@Teak 代码可以用代码框处理一下会好看很多。

回头我试试看,这段时间护网有点忙
页: [1]
查看完整版本: 160 CrackMe 003