zoukankan      html  css  js  c++  java
  • 成都信息工程学院第八届信息安全技术大赛crackme1爆破分析

    下载地址:https://files.cnblogs.com/tk091/crackme1.7z

    得到一个crackme,首先我们要对其进行分析,从而考虑如何下手,首先查壳,当然是无壳的了,然后运行程序,了解大致的情况。

    发现这是一个控制台程序,载入OD运行,看下OD的注释,发现有

     1 0040139E  |.  52            push edx                                 ; /pWSAData
     2 0040139F  |.  68 02020000   push 0x202                               ; |RequestedVersion = 202 (2.2.)
     3 004013A4  |.  E8 07020000   call <jmp.&WS2_32.#115>                  ; \WSAStartup
     4 004013A9  |.  6A 00         push 0x0                                 ; /Protocol = IPPROTO_IP
     5 004013AB  |.  6A 01         push 0x1                                 ; |Type = SOCK_STREAM
     6 004013AD  |.  6A 02         push 0x2                                 ; |Family = AF_INET
     7 004013AF  |.  E8 F6010000   call <jmp.&WS2_32.#23>                   ; \socket
     8 004013B4  |.  8985 60FAFFFF mov [local.360],eax
     9 004013BA  |.  66:C785 50FAF>mov word ptr ss:[ebp-0x5B0],0x2
    10 004013C3  |.  68 BE150000   push 0x15BE                              ; /NetShort = 15BE
    11 004013C8  |.  E8 D7010000   call <jmp.&WS2_32.#9>                    ; \ntohs
    12 004013CD  |.  66:8985 52FAF>mov word ptr ss:[ebp-0x5AE],ax
    13 004013D4  |.  68 54304200   push crackme1.00423054                   ; /127.0.0.1
    14 004013D9  |.  E8 C0010000   call <jmp.&WS2_32.#11>                   ; \inet_addr
    15 004013DE  |.  8985 54FAFFFF mov [local.363],eax
    16 004013E4  |.  6A 10         push 0x10                                ; /AddrLen = 10 (16.)
    17 004013E6  |.  8D85 50FAFFFF lea eax,[local.364]                      ; |
    18 004013EC  |.  50            push eax                                 ; |pSockAddr
    19 004013ED  |.  8B8D 60FAFFFF mov ecx,[local.360]                      ; |
    20 004013F3  |.  51            push ecx                                 ; |Socket
    21 004013F4  |.  E8 9F010000   call <jmp.&WS2_32.#4>                    ; \connect

    网络连接的函数,考虑是基于本地网络验证的,在本地验证中,肯定有一个发送注册码和接受验证码的情况。

    我们只需要爆破接受的结果即可。

    OD载入

    1 00401D56  |.  52            push edx
    2 00401D57  |.  A1 F8654200   mov eax,dword ptr ds:[0x4265F8]
    3 00401D5C  |.  50            push eax
    4 00401D5D  |.  8B0D F4654200 mov ecx,dword ptr ds:[0x4265F4]
    5 00401D63  |.  51            push ecx
    6 00401D64  |.  E8 A1F2FFFF   call crackme1.0040100A                   ;  主函数入口

    我们跟进去,单步

    1 00401281  |.  50            push eax
    2 00401282  |.  68 74304200   push crackme1.00423074                   ;  %s
    3 00401287  |.  E8 94090000   call crackme1.00401C20                   ;  这里是scanf

    走到scanf,输入key然后回车确定,中断后继续分析

    1 0040128C    83C4 08         add esp,0x8
    2 0040128F    8D8D 00FEFFFF   lea ecx,dword ptr ss:[ebp-0x200]
    3 00401295    51              push ecx
    4 00401296    E8 05090000     call crackme1.00401BA0
    5 0040129B    83C4 04         add esp,0x4
    6 0040129E    83F8 10         cmp eax,0x10                             ; 比较key的长度

    这里我们发现有一个和注册码长度的对比,原来是看注册码是否满足16位,那我们就来修改代码,让程序无法验证长度

    1 0040129E    83F8 10         cmp eax,0x10                             ; 比较key的长度
    2 004012A1    74 0C           je crackme1.004012AF                    ; 关键跳
    3 004012A3    E8 5DFDFFFF     call crackme1.00401005
    4 004012A8    33C0            xor eax,eax
    5 004012AA    E9 E5010000     jmp crackme1.00401494                    ; 跳转到结束

    我们把比较的地方修改为

    1 0040129E  |.  3BC0          cmp eax,eax

    这样就OK 了,我们保存文件,重新载入,发现程序可以正常运行。

    我们继续跟踪,一直到recv为止

    1 00401437  |.  6A 00         |push 0x0                                ; /Flags = 0
    2 00401439  |.  68 FF000000   |push 0xFF                               ; |BufSize = FF (255.)
    3 0040143E  |.  8D85 00FFFFFF |lea eax,[local.64]                      ; |
    4 00401444  |.  50            |push eax                                ; |Buffer
    5 00401445  |.  8B8D 60FAFFFF |mov ecx,[local.360]                     ; |
    6 0040144B  |.  51            |push ecx                                ; |Socket
    7 0040144C  |.  E8 3B010000   |call <jmp.&WS2_32.#16>                  ; \recv

    继续向下,看有没有跳转

    1 0040146A  |.  52            push edx
    2 0040146B  |.  68 40304200   push crack.00423040                      ;  ASCII "Sycflowercompany"
    3 00401470  |.  E8 4B050000   call crack.004019C0
    4 00401475  |.  83C4 08       add esp,0x8
    5 00401478  |.  85C0          test eax,eax
    6 0040147A  |.  75 11         jnz  crack.0040148D                      ;  关键跳
    7 0040147C  |.  68 28304200   push crack.00423028                      ;  ASCII "Congratulations!!!
    8 "

    这样,我们就可以爆破了。

  • 相关阅读:
    【转】Windows Server 2003为什么识别不了的移动硬盘
    VBSCRIPT常用函数【转】
    【轉】javascript实现图片缩略与优化
    【转】Tips:禁用Windows Beep声
    EXT同struts2后台交互一个中文问题
    ASCII码对照表[转]
    bat判断进程存在不存在
    look与look like
    美国俚语there was no snap in his turtle
    take credit for用法
  • 原文地址:https://www.cnblogs.com/tk091/p/2479498.html
Copyright © 2011-2022 走看看