文档章节

PEDIY Crackme 竞赛 2007---第一回

Explorer0
 Explorer0
发布于 2017/06/02 10:37
字数 743
阅读 23
收藏 0

    闲来无事,就找看雪2007Crackeme比赛的Crackme来练习一下~~~

    拿到的第一个程序,“crackme_by_topmint.exe”,首先打开它熟悉一下。

    

    

连续输入2次,得到以上结果,我们可以得知,key的格式必须为xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx,以及一些提示字符串。

    既然有了提示,那么就用IDA寻找一下String的位置。

    

运气挺好,在String-View中直接得到明文提示,转到IDA-View中,Ctrl+x回溯,往上滑动几下后来到关键函数StartAddress(),尝试F5分析一波~~~

    

DWORD __stdcall StartAddress(LPVOID lpThreadParameter)
{
  HWND v1; // eax@1
  int len_of_name; // ebx@1
  HWND v4; // eax@3
  int len_of_serial; // ebp@3
  HWND v6; // eax@5
  HWND v7; // eax@5
  int sum_of_char; // edx@5
  int j; // ecx@5
  CHAR x; // al@6
  signed int i; // edx@13
  const CHAR *v12; // [sp-Ch] [bp-11Ch]@25
  HWND v13; // [sp-8h] [bp-118h]@4
  const CHAR *v14; // [sp-8h] [bp-118h]@25
  CHAR name[256]; // [sp+10h] [bp-100h]@1
  __int16 v16; // [sp+10Ch] [bp-4h]@1
  char v17; // [sp+10Eh] [bp-2h]@1

  EnableWindow(hWnd, 0);
  memset(name, 0, 0xFCu);
  v16 = 0;
  v17 = 0;
  v1 = GetDlgItem(hDlg, 1000);
  len_of_name = GetWindowTextLengthA(v1);
  if ( (unsigned int)len_of_name > 0xFF )                    //name长度和255比较,大于则弹出错误提示
  {
    MessageBoxA(hDlg, aTheLengthOfThe, aError, 0x10u);
    EnableWindow(hWnd, 1);
    return 0;
  }
  v4 = GetDlgItem(hDlg, 1001);
  len_of_serial = GetWindowTextLengthA(v4);
  if ( len_of_serial )                                 //serial不为空
  {
    v6 = GetDlgItem(hDlg, 1000);
    GetWindowTextA(v6, name, 255);
    v7 = GetDlgItem(hDlg, 1001);
    GetWindowTextA(v7, String, 100);
    sum_of_char = 0;
    j = 0;
    if ( len_of_name <= 0 )                         //serial长度小于等于0
    {
LABEL_13:
      for ( i = sum_of_char + 1; i > 7040; i >>= 2 )
        ;
      dword_40AAB0 = i;
      //进行serial格式对比
      if ( len_of_serial == 39
        && byte_40AA08 == '-'
        && byte_40AA0D == '-'
        && byte_40AA12 == '-'
        && byte_40AA17 == '-'
        && byte_40AA1C == '-'
        && byte_40AA21 == '-'
        && byte_40AA26 == '-' )
      {
        sub_401640();
        if ( dword_40AAB0 == dword_40AB5C )       //关键比较
        {
          MessageBoxA(hDlg, aWelcomeToHarbi, aWelcome, 0x40u);
          v13 = hWnd;
        }
        else
        {
          MessageBoxA(hDlg, aTryAgainNeverG, aSorry, 0x10u);
          v13 = hWnd;
        }
        goto LABEL_29;
      }
      v14 = aError;
      v12 = aTheKeyMustBeXx;
    }
    else
    {
      while ( 1 )
      {
        //x遍历name,累加到sum_of_char
        x = name[j];
        if ( (x < '0' || x > '9') && (x < 'A' || x > 'Z') && (x < 'a' || x > 'z') )
          break;
        sum_of_char += x;
        //当遍历name完成,则跳转到LABEL_13
        if ( ++j >= len_of_name )
          goto LABEL_13;
      }
      v14 = aError;
      v12 = aTheNameContain;
    }
    MessageBoxA(hDlg, v12, v14, 0x10u);
    v13 = hWnd;
  }
  else
  {
    MessageBoxA(hDlg, aPleaseInputThe, aError, 0x10u);
    v13 = hWnd;
  }
LABEL_29:
  EnableWindow(v13, 1);
  return 0;
}

F5分析得已经很明显了。程序首先判断name长度是否超过255,不超过则遍历name将其中的字符累加到sum_of_char中,然后跳转到LABEL_13。LABEL_13中,首先赋值i=sum_of_char+1,如果i>7040,i=i/4,否则i不变。接下来,将i赋值给dword_40AAB0,再进行serial格式判断,如果serial格式合格,最后再判断dword_40AAB0==dword_40AB5C,等于则成功。

    由以上分析可知,我们目前不知道的是dword_40AB5C这个变量,所以上(OD)动态调试观察此处。

可以清楚的看到,经过004017ED   .  E8 4EFEFFFF   call crackme_.00401640之后,40AB5C=0x1B80(7040),而40AAB0处依然是“Fucker”的累加之和+1---0x261。综上,最后需要name的累加之和=7039。

    所以,得出一组code,name:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxO

                                       serial:1234-1234-1234-1234-2134-8520-7894-9632(serial随意)

© 著作权归作者所有

Explorer0
粉丝 4
博文 39
码字总数 22884
作品 0
厦门
其他
私信 提问
OllyDBG 破解入门教程

一、OllyDBG 的安装与配置 OllyDBG 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 Olly...

angel_kitty
2017/10/11
0
0
apktool使用过程中遇到的错误

Destination directory (D:daylyapktool1.5.2crackme0201) already exists. Use -f switch if you want to overwrite it. 说明crackme0201文件夹已经存在,删除这个文件夹后问题就好了。2. ......

独鸣在彼岸
2016/03/02
329
0
安全学习资料汇总--IosHackStudy

IOS 安全学习资料汇总: IOS 安全学习资料汇总(1) IOS安全学习网站收集: http://samdmarshall.comhttps://www.exploit-db.com https://reverse.put.ashttp://www.securitylearn.net/archive......

1354057778
2015/10/22
380
0
字符串中第一个出现一次的字符(Java)

正在挑战一个CrackMe的你,把需要填写的前面几位密码都正确猜出了,可是这最后一位密码,好像藏得有点深。CrackMe的作者还挑衅般的在里面藏了个.tar.gz文件,解压缩出来,里面写道你要的最后...

zGA
2015/08/13
567
0
国密算法SM2/3/4实现

相关信息 国家密码管理局发布的标准 SM2:http://www.oscca.gov.cn/News/201012/News_1197.htm SM3:http://www.oscca.gov.cn/News/201012/News_1199.htm SM4的没找到 开源实现 Github上找到......

realm520
2016/11/24
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
45分钟前
4
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
4
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
13
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
14
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部