吾爱破解专题汇总:【反汇编练习】160个CrackME索引目录1~160建议收藏备用

一、Serial/Name 之 暴力破解

1. 熟悉界面:很常规的一个界面,输入完账号密码之后会进行验证。

 2. ollbdg调试 - 如何下第一个断点

  1)问题1:因为这不像编程,编程时这里会存在一个main函数入口,但这个根本没有,所以如何下第一个程序断点来分析就非常重要。

    答案:利用函数调用栈来找到调用MessageBoxA的地址.这时肯定存在栈顺序,xxa->xxb->MessageBox->kernel32.dll!xx->xx,我们通过MessageBox作为一个浮标来确定好其他位置。

  2)问题2:但这里又存在另外一个问题,我们如何确定代码执行的位置(exe),是xxa、xxb还是xxc呢?

    答案:通过模块调用查看exe的起始地址,若在xxa、xxb、xxc中存在一个与之相近的值,则说明该call就是调用的。

  3)分析流程:

    1>在显示"sorry,The serial is incorect"窗口暂停,在olldbg中点击 "K" 按钮,查看函数call的顺序。

    

      很遗憾,并没有找到我们所期待的MessagBox函数,但别灰心,我们利用栈再继续分析。

    2>如图,栈拓展顺序由高向低,我们找栈内部的应该向下找。找到最下边的显示调用。

    

    3>在该点处下断点,然后继续执行,再弹出一次错误提示框,再这里断下。(这里为了分析栈更省力气,当然可以直接从4>开始找)

    

    4>olldbg中右下角栈,其中返回地址都以红色部分标记出来,找到与exe模块相似的地址,按回车(follow in dump)看其代码段。

    

    5>可以看到上面出现了我们熟悉的字符串(注意:虽然调用的还是exe函数,但是结果已经出了,所以运算绝对不可能出现在函数中!)

    

    至此,我们算是正确的下第一个断点了!

3.分析代码逻辑

  所谓分析逻辑,其实这里判断 if else 语句,反应在汇编中就是各种jmp,我们只需要找到算法关键的jmp即可。

  而这类关键jmp其实紧跟在结果输出语句中。

  

  仔细观察上述汇编结构,显然存在两点:

  1> jmp 语句跳过判断错误的,则上面那句明显是判断正确的。

  2> 两个都调用 bur.0042A170,这个函数明显是显示结果的。

  因此,基于上面分析,我们可以推断出其编写的是下列代码:

    if(正确)show(正确xxx);

    else show(错误xxx)

4. 找到算法call

   

   如上图,经过分析,我们发现其 0x42FB03c处,调用一个call之后紧接着jmp输出错误,很明显if(func()){show(错误)},则可以是算法验证函数 Acid_bur.004039FC

    这样,我们很容易使用"爆破法"来破解这个软件了。

5.分析体会:

  1)该题难度一般,主要通过栈帧来定位到用户代码。

  2)爆破法关键是跳转,因此我们分析过程中注意各种跳转语句。


Serial/Name 之 算法分析

  显然,单纯的找到调用,使用爆破法,有点太低级了,我们深入上次找到的这个 算法验证函数 Acid_bur.004039FC 来分析其算法,写出注册机。

  在分析该函数之前,我们应该明确,该函数到底是 结果验证函数 还是 算法生成函数。因为这个函数可能只是验证结果是否正确,因此我们需要预先验证。

1.检验 Acid_bur.004039FC 函数作用:

   

  1> 分析函数首先需要明确其传入参数,寄存器传入与栈传入都应该注意到。

    栈传参:明显是一些异常处理程序,这里可以说没什么用

     

    寄存器传参:函数调用前使用过eax与edx寄存器,可以看到明显有有用信息。   

      

  2> 验证EAX的是否是密码:很明显,该函数就是验证函数,EAX存放值。

    

2.密码生成的推测:CW-4018-CRACKED,可以看到由三个部分组成 CW、4018、CRACKED,

  1>我们之后再需要分析,其哪个是变量,哪个是常量,再构造一组用户输入。

    构造密码原则:与前面密码完全不重复(因为有可能仅用到几个数)

    

    可以看到其中间四个数改变了,所以这个才是关键。

  2>"数字-字符串"转换过程分析:这里的密码验证的是4018这个字符串,但密码在生成过程中需要的是4018这个数字。

    这就意味着:中间很可能存在一步,将字符串转换为数字。

    又因为在计算机中是十六进制存储,若4018为十进制结果,我们很可能在内存中看到的数字为其十六进制:FB2;若为十六进制,则看到4018.

    

3.寻找serial生成函数

  1>先扫描一遍上面区域(眼光放长远一点,不要紧盯着上边函数看,因为生成的是字符串,肯定还存在字符串拼接函数)

    

    看到有两个 "-" ,则可以判断中间那个肯定是 密码的字符串形式 (注意:不是数字形式,可能该函数将数字生成一个字符串)

  2> 验证 00406718 函数

    该函数特征:其传入一个local.6指针且没用到返回值eax,则该变量很可能储存再local.6内存中,我们在内存窗口关注该地址

    

    很明显符合我们的假设。local.6存储生成结果

  3> 查看数字是如何生成的:

    函数调用另外一个是使用eax寄存器,传入一个数。

      0042FAC8  |.  A1 50174300   mov eax,dword ptr ds:[0x431750]
    经过寄存器查看为 1056

    其正好是 4182d的十六进制形式(0x1056)

    

  4>继续寻找 serial生成算法

    我们现在已经确定其存储在 0x431750 内存中,我们只需要查看是谁调用这个内存,往上看,就很容易找到该地点了。

    

4. serial生成算法分析:

  1> local.4 是用户名,因此 movzx eaax,byte ptr ds:[eax] 是将用户输入的第一个字符(ASCII)放入到eax中。(注意其是ASCII码,并不是数字)

  2> [0x431750] 原来存放的是十六进制0x29,所以该 ASCII * 0x29

  3> add 将结果乘以两倍, 故最终算法是 0xResult = INPUT[0]*0x29*2

  4> 将0xResult转换为十进制字符形式,然后两边拼接在一起组成最终的 serial。

5. 解题体会:

  1)在逆向分析中,看到数字第一反应是十六进制(而非十进制),这思想非常重要(否则可能白白浪费你大量精力)

  2)明确字符串与数字之间的转换,明确分析目标,分析的是字符串还是数字。如果最终验证是字符串,而算法往往针对数字,因此你需要注意中间一个转换条件。(别被绕蒙了)。

  3)函数传入时如果使用 lea 传入指针,而该指针属于变量指针,则往往这里存储某些重要的值,查看内存来进行判断。

  4)字符串赋值,实质上是指针赋值(C\C++中字符串被编译为常量,因此属于全局变量)。

  5)  byte ptr 这类声明应该敏感。 如 "movzx byte ptr eax, ds:[eax]",将字符串中第一个字符取出。


三、第2个serial破解

  该题破解难度较小,通过"栈分析定位代码"与"serial验证查找跳转"很容易就找到答案了。

    

  因为本身 serial为静态的 "Hello Dule!",因此也谈不上算法分析了。

    

  算是前两题的一个小总结吧。

  

 

      

    

[CrackMe]160个CrackMe之001的更多相关文章

  1. [CrackMe]160个CrackMe之015

    吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.破解 该破解比较简单,其是一个静态密码  2G83G35Hs2 ,输入进去即可破解. 1)栈定位法找到用户代码 ...

  2. [CrackMe]160个CrackMe之002

    吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.逆向分析之暴力破解 暴力破解,对于这种具有提示框的,很好定位. 定位好之后,爆破其跳转语句,就能达到破解目的. ...

  3. [反汇编练习]160个CrackMe之001

    [反汇编练习] 160个CrackMe之001. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. .net core入门-项目启动时报错:HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure

    在打开Core的项目首页时,页面有时候会出现:HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure的错误,但是这里面看不出任何错误详情,这个时候 ...

  2. Tomcat8史上最全优化实践

    Tomcat8史上最全优化实践 1.Tomcat8优化 1.1.Tomcat配置优化 1.1.1.部署安装tomcat8 1.1.2 禁用AJP连接 1.1.3.执行器(线程池) 1.1.4 3种运行 ...

  3. Oracle 去重后排序

    因项目需求,需要将查询结果,去重后,在按照主键(自增列)排序,百度一番,记录下来 DEMO SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY S ...

  4. /etc/profile和~/.bash_profile等文件的区别和联系

    对比说明:/etc/profile:为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效.当被修改时,必须重启才会生效.英文描述:”System wi ...

  5. XML的互相序列化对象

    using System.Xml.Serialization; using System.IO; using System.Xml; namespace Common { public class X ...

  6. jquery-uploadfile的使用(多文件异步上传)

    需求 在页面端可以在页面不刷新情况下上传多个有大小限制的word文件,并返回文件保存的路径,同时可以删除误上传的文件. 准备 下载该插件 该插件依赖jquery1.9.1版本(其它不清楚)*在jsp页 ...

  7. Dynamics CRM定制子网格添加按钮实例之二:调试代码、打开Web资源及获取选择的记录

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复222或者20160501可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. docker 简单介绍与安装

    主机虚拟化(vmware,visual box等) type-Ⅰ type=Ⅱ 主机虚拟化是隔离最彻底的,但是由于多隔了一个虚拟的操作系统,性能会慢一些. 容器虚拟化(docker等) 隔离没有主机虚 ...

  9. JSON理解(一篇就够了)

    可以看看视频讲解,视频几十分钟就结束了 JSON 1.什么是json 其实是一种数据格式的规范,与开发的语言无关,轻量级的数据格式 全称JavaScript Object Notation 2.优点: ...

  10. Git之SSH公钥与私钥

    今天来探讨一下如何使用Git的操作,来进一步的实现代码的下载到本地,我原来也不是很明白git中生成公钥和私钥的作用,我一直在想,git里面你把自己的公钥发给了git的服务器,他是怎么判断的,每一次我换 ...