阿虚
Hello World!
Hello World!
乘风破浪

0x0 环境

——————–

环境:

系统:Windows 10

工具:IDA 7.X,x64dbg

——————–

0x1 跑起来

跑起来后又是没饭吃做的猜谜,奥利给一下就能知道OK的回调地址为0x00E31830.

IDA分析

不过Button没多少函数直接一个SetEvent。如果不了解一定Windows编程可能就有点懵逼了,我觉得作者还是躲懒了,如果把hEvent写作dlg成员变量可能会更难一点。

 .text:00E31830 $Button         proc near 
.text:00E31830                 push    1 
.text:00E31832                 call    ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:00E31837                 mov     eax, hEvent
.text:00E3183C                 test    eax, eax
.text:00E3183E                 jz      short locret_E31847
.text:00E31840                 push    eax 
.text:00E31841                 call    ds:SetEvent 
.text:00E31847 locret_E31847: 
.text:00E31847                 retn
.text:00E31847 $Button         endp

直接交叉引用就能跳转到了0x 00E31220这一个线程函数。当Button中SetEvent后这里的WaiteForsingObj就会返回成功。

.text:00E31244 loc_E31244:       
.text:00E31244                 mov     eax, hEvent
.text:00E31249                 push    0FFFFFFFFh      ; dwMilliseconds
.text:00E3124B                 push    eax             ; hHandle
.text:00E3124C                 call    ds:WaitForSingleObject
.text:00E31252                 mov     ecx, hEvent
.text:00E31258                 push    ecx             ; hEvent
.text:00E31259                 mov     esi, eax
.text:00E3125B                 call    ds:ResetEvent
.text:00E31261                 test    esi, esi
.text:00E31263                 jnz     while_continue  ;

接下来这段通过X64Dbg单步跟踪可以得知为user string和passworld string。

.text:00E31269                 mov     edx, [edi+78h]  ; edx = user string
.text:00E3126C                 mov     ecx, [edx-0Ch]  ; ecx = user length
.text:00E3126F                 lea     ebp, [edi+78h]  ; ebp = user string address
.text:00E31272                 test    ecx, ecx
.text:00E31274                 jz      while_continue  ; user length == 0 continue;
.text:00E31274                                         ; ;
.text:00E3127A                 mov     eax, [edi+7Ch]  ; eax = password string
.text:00E3127D                 mov     eax, [eax-0Ch]  ; eax = password length
.text:00E31280                 lea     edx, [edi+7Ch]  ; edx = password string address
.text:00E31283                 test    eax, eax
.text:00E31285                 jz      short while_continue ; passworld length == 0 continue
.text:00E31287                 cmp     ecx, eax
.text:00E31289                 jnz     short while_continue ;

这个函数中判断user和password是否一样,如果一样则重新等到输入

.text:00E3128B                 push    edx             ; passworld string address
.text:00E3128C                 push    ebp             ; user string address
.text:00E3128D                 call    check_user_equ_passworld
.text:00E31292                 add     esp, 8
.text:00E31295                 test    al, al
.text:00E31297                 jnz     short while_continue ; if user == passworld continue;

text:00E31870 check_user_equ_passworld proc near 
.text:00E31870 user_string_address= dword ptr  4
.text:00E31870 passworld_string_address= dword ptr  8
.text:00E31870
.text:00E31870                 mov     eax, [esp+passworld_string_address]
.text:00E31874                 mov     ecx, [eax]
.text:00E31876                 test    ecx, ecx
.text:00E31878                 jnz     short loc_E31884
.text:00E3187A                 push    80004005h       ; if passworld == NULL
.text:00E3187F                 call    try_fun
.text:00E31884 ;  
.text:00E31884 loc_E31884:                             ; CODE XREF: check_user_equ_passworld+8↑j
.text:00E31884                 mov     edx, [esp+user_string_address]
.text:00E31888                 mov     eax, [edx]      ; eax = user_string;
.text:00E3188A                 lea     ebx, [ebx+0]    ; ecx = passworld_string
.text:00E31890
.text:00E31890 do_while:                               ; CODE XREF: check_user_equ_passworld+40↓j
.text:00E31890                 mov     dx, [eax]
.text:00E31893                 cmp     dx, [ecx]
.text:00E31896                 jnz     short loc_E318BE ; if (user_string[i] != passworld_string[i])
.text:00E31898                 test    dx, dx
.text:00E3189B                 jz      short do_while_break ; if (user_string[i] == 0x0) break;
.text:00E3189B                                         ; ;
.text:00E3189D                 mov     dx, [eax+2]
.text:00E318A1                 cmp     dx, [ecx+2]
.text:00E318A5                 jnz     short loc_E318BE
.text:00E318A7                 add     eax, 4
.text:00E318AA                 add     ecx, 4
.text:00E318AD                 test    dx, dx
.text:00E318B0                 jnz     short do_while 
.text:00E318B2 do_while_break:  
.text:00E318B2                 xor     eax, eax
.text:00E318B4                 xor     ecx, ecx
.text:00E318B6                 test    eax, eax
.text:00E318B8                 setz    cl
.text:00E318BB                 mov     al, cl          ; return 1
.text:00E318BD                 retn 
.text:00E318BE loc_E318BE:                          
.text:00E318BE                 sbb     eax, eax
.text:00E318C0                 sbb     eax, 0FFFFFFFFh
.text:00E318C3                 xor     ecx, ecx
.text:00E318C5                 test    eax, eax
.text:00E318C7                 setz    cl
.text:00E318CA                 mov     al, cl          ; return 0;
.text:00E318CC                 retn
.text:00E318CC check_user_equ_passworld endp

接下来检测输入的user string长度如果小于8位则失败

.text:00E31299                 mov     ecx, [ebp+0]
.text:00E3129C                 mov     ebx, [ecx-0Ch]
.text:00E3129F                 cmp     ebx, 8
.text:00E312A2                 jl      short while_continue ; user length < 8 continue;

下面就说检查password的逻辑了。

.text:00E312A4                 xor     eax, eax
.text:00E312A6                 test    ebx, ebx
.text:00E312A8                 jle     short do_while2_end ;  ; ;
.text:00E312AA                 lea     edx, [ebx-1]    
.text:00E312AD                 lea     edi, [ebx+ebx-2] ; edi = user_length * 2
.text:00E312B1 do_while2:                              
.text:00E312B1                 test    eax, eax         
.text:00E312B3                 jl      short fun_try   ; 
.text:00E312B5                 mov     esi, [ebp+0]    ;  
.text:00E312B8                 cmp     eax, [esi-0Ch]
.text:00E312BB                 jg      short fun_try   ; if index > user string length fun_try; 
.text:00E312BD                 test    edx, edx
.text:00E312BF                 jl      short fun_try   ; if user length < 0 fun try 
.text:00E312C1                 mov     ecx, [esp+10h+lpThreadParameter]
.text:00E312C5                 add     ecx, 7Ch ; '|'
.text:00E312C8                 mov     ecx, [ecx]      ;  
.text:00E312CA                 cmp     edx, [ecx-0Ch]
.text:00E312CD                 jg      short fun_try   ; 
.text:00E312CF                 mov     si, [esi+eax*2] ; si = user_string[index * 2];
.text:00E312D3                 cmp     si, [edi+ecx]   ; passworld[user_length * 2];
.text:00E312D7                 jnz     short while_continue ; 
.text:00E312D9                 inc     eax            
.text:00E312DA                 sub     edi, 2          ; unicode_user_length -= 2;
.text:00E312DD                 dec     edx              
.text:00E312DE                 cmp     eax, ebx
.text:00E312E0                 jl      short do_while2 ; 
.text:00E312E2 do_while2_end:                   
.text:00E312E2                 mov     eax, hObject
.text:00E312E7                 test    eax, eax
.text:00E312E9                 jz      short while_continue
.text:00E312EB                 push    eax             ; hEvent
.text:00E312EC                 call    ds:SetEvent     ; check ok 
.text:00E312F2 while_continue:         
.text:00E312F2                 cmp     dword_E72A64, 0
.text:00E312F9                 jnz     do_while
.text:00E312FF                 pop     esi
.text:00E31300                 pop     ebp
.text:00E31301                 pop     ebx 
.text:00E31302 fun_end:  
.text:00E31302                 pop     edi
.text:00E31303                 retn

阿虚

文章作者

发表评论

textsms
account_circle
email

Hello World!

乘风破浪
0x0 环境 -------------------- 环境: 系统:Windows 10 工具:IDA 7.X,x64dbg -------------------- 0x1 跑起来 跑起来后又是没饭吃做的猜谜,奥利给一下就能知…
扫描二维码继续阅读
2020-03-27