CrackMe 分析

0x00 流程分析

提示输入帐号密码

图片2

回车后 提示 需要重新输入

载入OD

图片3

字符串搜索

找main函数

图片4

此时停在 00401060这里,是个

00401060  /$  83EC 30       sub esp,0x30 //分配栈帧

00401063  |.  68 FC804000   push Crackme.004080FC   ;  input your name:

00401068  |.  E8 6C020000   call Crackme.004012D9// printf

0040106D  |.  8D4424 1C     lea eax,dword ptr ss:[esp+0x1C]

00401071  |.  50            push eax

00401072  |.  68 F8804000   push Crackme.004080F8     ;  %s

00401077  |.  E8 46020000   call Crackme.004012C2

0040107C  |.  68 E4804000   push Crackme.004080E4       ;  input your pass:

00401081  |.  E8 53020000   call Crackme.004012D9// scanf

00401086  |.  8D4C24 10     lea ecx,dword ptr ss:[esp+0x10]

0040108A  |.  51            push ecx

0040108B  |.  68 F8804000   push Crackme.004080F8    ;  %s

00401090  |.  E8 2D020000   call Crackme.004012C2       ;  scanf()

00401095  |.  8D5424 18     lea edx,dword ptr ss:[esp+0x18]     ;  edx存放帐号地址

00401099  |.  8D4424 30     lea eax,dword ptr ss:[esp+0x30]     ;  eax存放密码地址

0040109D  |.  52            push edx

0040109E  |.  50            push eax

0040109F  |.  E8 5CFFFFFF   call Crackme.00401000//call 参数为两个地址 edx eax

004010A4  |.  83C4 20       add esp,0x20// 平衡堆栈

004010A7  |.  84C0          test al,al//若al为0 则 zf = 1 则je成立

004010A9  |.  74 19         je XCrackme.004010C4  //这里会跳到一个提示try again

图片5

这里是提示正确or错误的地方

004010A9  |. /74 19         je XCrackme.004010C4

004010AB  |. |68 D8804000   push Crackme.004080D8   ;  good job!\n

004010B0  |. |E8 24020000   call Crackme.004012D9

004010B5  |. |68 C0804000   push Crackme.004080C0   ;  the key is: md5(pass)

004010BA  |. |E8 1A020000   call Crackme.004012D9

004010BF  |. |83C4 08       add esp,0x8

004010C2  |. |EB 0D         jmp XCrackme.004010D1

004010C4  |> \68 B4804000   push Crackme.004080B4   ;  try again!

004010C9  |.  E8 0B020000   call Crackme.004012D9

0x01 验证函数分析

入口点

0040109F  |.  E8 5CFFFFFF   call Crackme.00401000         //验证函数

00401000  /$  55            push ebp

00401001  |.  56            push esi

00401002  |.  8B7424 0C     mov esi,dword ptr ss:[esp+0xC]  ;  参数一

00401006  |.  57            push edi

00401007  |.  8BFE          mov edi,esi

00401009  |.  83C9 FF       or ecx,0xFFFFFFFF

0040100C  |.  33C0          xor eax,eax

0040100E  |.  8B5424 14     mov edx,dword ptr ss:[esp+0x14]  ;  参数二

00401012  |.  F2:AE         repne scas byte ptr es:[edi]   ;  长度

00401014  |.  F7D1          not ecx

00401016  |.  49            dec ecx

00401017  |.  8BFA          mov edi,edx     ;  edi存放密码地址

00401019  |.  8BE9          mov ebp,ecx      ;  ebp存放帐号长度

0040101B  |.  83C9 FF       or ecx,0xFFFFFFFF

0040101E  |.  F2:AE         repne scas byte ptr es:[edi]

00401020  |.  F7D1          not ecx

00401022  |.  49            dec ecx    ;  密码长度

00401023  |.  3BE9          cmp ebp,ecx          ;  长度比较

00401025  |.  74 06         je XCrackme.0040102D    ;  长度相等继续 不等退出

00401027  |.  5F            pop edi

00401028  |.  5E            pop esi

00401029  |.  32C0          xor al,al

0040102B  |.  5D            pop ebp

0040102C  |.  C3            retn

0040102D  |>  33C0          xor eax,eax

0040102F  |.  85ED          test ebp,ebp

00401031  |.  7E 19         jle XCrackme.0040104C

00401033  |.  53            push ebx

00401034  |.  BF 30804000   mov edi,Crackme.00408030  ;  全局变量 使用edi存放数组首地址

00401039  |>  8A0F          /mov cl,byte ptr ds:[edi]   ;  cl= [edi+eax]

0040103B  |.  8A1C10        |mov bl,byte ptr ds:[eax+edx]   ;  bl=密码地址+eax

0040103E  |.  32D9          |xor bl,cl      ;  密码=密码xor 数组[eax]

00401040  |.  83C7 04       |add edi,0x4       ;  下一个元素

00401043  |.  881C10        |mov byte ptr ds:[eax+edx],bl

00401046  |.  40            |inc eax         ;  eax++

00401047  |.  3BC5          |cmp eax,ebp       ;  eax < strlen(密码)

00401049  |.^ 7C EE         \jl XCrackme.00401039    ;  eax < ebp

0040104B  |.  5B            pop ebx

0040104C  |>  8BFA          mov edi,edx

0040104E  |.  8BCD          mov ecx,ebp

00401050  |.  33D2          xor edx,edx

00401052  |.  F3:A6         repe cmps byte ptr es:[edi],byte ptr ds:[esi]

00401054  |.  8BC2          mov eax,edx

00401056  |.  5F            pop edi

00401057  |.  5E            pop esi

00401058  |.  5D            pop ebp

00401059  |.  0F94C0        sete al//相等 al = 1

0040105C  \.  C3            retn

加密用的table 值

图片6

首先判断帐号密码长度是否相等

图片7

若长度相等,则首先将 密码中的各个元素与 00408030处的数 xor 操作,得到当前密码,

然后将密码与帐号进行比较

图片8

esi存放的是帐号 edi为密码

sete zf = 1 则al = 1

图片9

这样就过了。

时间: 2024-10-07 01:41:12

CrackMe 分析的相关文章

360破解大赛crackme分析--之3DES解密附加数据

详细的分析这里有,本人只是对这里面有趣的算法进行了一些学习 分析链接 这次是逆向的使用3DES解密的过程中的内容: 使用微软的crypt库 使用3DES解密程序中的附加数据 代码: VOID encryptData() { TCHAR szModuleFile[MAX_PATH] = "C:\\Users\\Administrator\\Desktop\\破解技术考题 360\\破解考题.over"; HANDLE hFile = ::CreateFile(szModuleFile,

IOLI crackme分析——从应用中学习使用radare2

Crackme0x00 - writeup 我现在开始看radare2book了,现在刚看1/3,有些无聊,因为之前也看过一些radare2的实例讲解,所以现在先试着做一下里面的crackme练习. 先执行一下craceme0x00这个文件,看来是要把密码找出来. [email protected]:~/IOLIcrackme/bin-linux# ./crackme0x00 IOLI Crackme Level 0x00 Password: 1234 Invalid Password! 现在看

一个crackme的分析

是看雪合集的一个,因为老师让我们多练习,所以我就找了个crackme来练习 http://images2015.cnblogs.com/blog/638600/201612/638600-20161204133021912-1043107339.jpg 因为似乎传不了附件,所以我就把zip压缩包改成.jpg扩展名,作为图片插入了. 下载完后,把jpg,改成.zip就可以了 这个crackme名字叫Imagination, 是有关bmp的文件验证.

接触CrackMe 第一个

今天刚接触这个 做了一个简单的. 用Onlydbg加载之后,对GetDlgItemTextA函数下断点,因为程序是在控件上获取数据的. Register输入Name和Serial点击Ok之后,断点响应. 然后执行到return 返回到程序的代码,返回值就是 我们输入的数据. 然后经过一大段代码. 然后会看到下面这几行,其中两个call分别对两个数据进行处理. CALL CRACKME.0040137E   观察会变代码就会发现 , 这部分代码主要是判断输入字符串 按照我们的例子 如果是小写字母

160个crackme 004 ajj.1

这个crackme是有点奇葩的,输入name和Serial之后,就没有然后,然后了... 打开以后,输入伪码之后,什么也没有,没有按钮,一副死猪不怕开水烫的样子. PEid,看一下,Delphi的程序: 首先,用Delphi的神器:DeDe: 打开之后,找到过程,发线有几个过程,依次去看: 00457BD0 53 push ebx 00457BD1 8BD8 mov ebx, eax 00457BD3 8D8310030000 lea eax, [ebx+$0310] * Possible St

# 160个CrackMe 003 Afkayas.2

CrackMe 003是002的加强版,我们看看加强在哪里. OD运行,发现提示代码可能显示会出现问题,有压缩,用PEDI查一下, 发现程序并没有壳,这样即使有压缩,我们也可以手动脱掉. 首先,伪码检测: 进入OD,查找参考文本字符串,之后Call进去 向上大致查看一下程序的流程,然后找到函数的头部,F2下断,注意这个函数有点长,需要耐心一点 F9跑起来,输入我们的伪码,开始单步调试,还是同样的原则,先F8,遇到不认识的VB API函数就去查一下他是干什么的,我们需要做的是了解程序的流程,再遇到

160个CrackMe 002 Afkayas.1

首先,同样的操作,PEID查壳: VB的程序,没有壳,OK,注意一下VB中的函数就可以了,这里推荐一个微博,总结了在逆向中常用到的VB的函数 VB程序逆向反汇编常见的函数 试着自己运行: OD运行起来,右键,查找,查找所有参考文本字符串,找到错误字符串的位置 看到我们的错误字符串了,You Get Wrong,并且在上面还发现了应该是正确的字符串,两个字符串相距不远,嗯嗯,这个题目应该不难(至少跳转会少些..) 双击字符串进入位置,发现了跳转指令 在跳转的位置F2下断,重新运行程序,输入我们瞎扯

[反汇编练习] 160个CrackMe之020

[反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西. 其中,文章中按照如下逻辑编排(解决如下问题): 1.使用什么环境和工具 2.程序分析 3.思路分析和破解流程 4.注册机的探索 ---------------------------------- 提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大

第一个Android crackme(2016-05)

第一个Android crackme ? 0x00 背景 最近在学习Android的逆向,把基本的环境搭好后,看了看<第一行代码--Android>,然后就按照非虫大牛的<Android软件安全与逆向分析>开始了第一个apk的crack. 这篇文章权当是记录,没有什么技术含量. ? 0x01初探 首先来看看要crack的apk长啥样儿,启动一个安卓虚拟机,然后使用adb将apk安装到虚拟机中,命令如下: 可以看到虚拟机中已经安装了该apk: ? 启动这个apk,输入任意的用户名和注