吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2949|回复: 10
收起左侧

[CrackMe] 一个娱乐向CM

  [复制链接]
zzhwaxy 发表于 2020-5-14 22:19
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 zzhwaxy 于 2020-5-15 10:43 编辑

娱乐向CM

闲着无聊,写了一个CM。

是用VC++6.0编译的win32控制台程序。

题目本身并没有难度

感兴趣的可以来挑战一下。

如果做出来了可以分享一下你的答案。

GOOD LUCK!


分割线


下面介绍一下我的设计思路和开放源代码

平时做逆向题目的时候,总会碰到各种循环,所以我就利用跳转难以读懂的特性,稍微动了点手脚。

程序的流程

以输入的字符串长度作为switch分支语句的入口点。

难点在于字符串长度不知道,难以预测一开始走的是哪一个。

对每一位输入做判断,每一个判断有两个跳转。

这里使用了 count 来验证最后的跳转。

考虑不周,存在多解的情况。

源代码

#include<stdio.h>
#include<string.h>
int main()
{
  int len;
  int i=0,count=0;
  char name[20];
  printf("Please input key:\n");
  scanf("%s",name);

  len=strlen(name);
  if(len<0 || len > 10 )
    {
    goto end;
    }

  switch(len){
  case 0:
  Label0:
    if(name[i]=='z')
      {
        i++;
        count-=1;
        goto Label1;
      }else if(name[i]=='q')
      {
        i++;
        count+=1;
        goto Label2;
      }
  case 1:
  Label2:

    if(name[i]=='w')
      {
        i++;
        count+=2;
        goto Label3;
      }else if(name[i]=='r')
      {
        i++;
        count+=1;
        goto Label4;
      }
  case 2:
  Label4:
    if(name[i]=='x')
      {
        i++;
        count+=1;
        goto Label5;
      }else if(name[i]=='e')
      {
        i++;
        count+=4;
        goto Label6;
      }
  case 3:
  Label6:

    if(name[i]=='!')
      {
        i++;
        count+=1;
        goto Label7;
      }else if(name[i]=='+')
      {
        i++;
        count+=1;
        goto Label0;
      }
  case 4:
  Label8:
    if(count==9)
    {
        printf("Success!");
        getchar();
        getchar();
        return 0;
    } 
    else
    {
      getchar();
      getchar();
      printf("Failed");
      break;
    }

  case 5:
  Label7:

    if(name[i]=='<')
      {
        i++;
        count-=1;
        goto Label8;
      }else if(name[i]=='+')
      {
        i++;
        count+=1;
        goto Label2;
      }
  case 6:
  Label5:
    if(name[i]=='y')
      {
        i++;
        count+=1;
        goto Label6;
      }else if(name[i]=='p')
      {
        i++;
        count+=1;
        goto Label7;
      }
  case 7:
  Label3:
    if(name[i]=='a')
      {
        i++;
        count+=3;
        goto Label4;
      }else if(name[i]=='x')
      {
        i++;
        count+=2;
        goto Label5;
      }
  case 8:
  Label1:
    if(name[i]=='h')
      {
        i++;
        count+=2;
        goto Label2;
      }else if(name[i]=='r')
      {
        i++;
        count+=1;
        goto Label3;
      }
  case 9:
    if(name[i]=='z')
      {
        i++;
        count+=1;
    goto Label0;
      }
    else if(name[i]=='/')
      {
        i++;
        goto Label1;
        count-=1;
      }
    break;

  }
 end:
  printf("Failed");
  getchar();
  getchar();
  return 0;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 4吾爱币 +8 热心值 +4 收起 理由
CrazyNut + 6 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dreamlivemeng + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
exluku + 1 + 1 热心回复!
起航的宇航员 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

玖公子 发表于 2020-5-15 10:05
本帖最后由 玖公子 于 2020-5-15 10:08 编辑
赤座灯里 发表于 2020-5-14 22:52
[mw_shl_code=c,true]#include
#include

大佬太强了,我OD跟了半天,没找出正确的流程,用了你的,发现成功了。
flag是9位数:zzhwaxy!<



0040119F  |>  837D F4 09    cmp [local.3],0x9  ;判断长度是否等于9
004011A3  |. |0F85 A5000000 jnz trick.0040124E
004011A9  |. |68 24504200   push trick.00425024                      ;  Success!
004011AE  |. |E8 CD080000   call trick.00401A80

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
CrazyNut + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

玖公子 发表于 2020-5-15 09:53


我以为码追出来了,然后发现不对,必须要取9个字符出来......,找不到正确的流程,只能爆破了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
CrazyNut + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

赤座灯里 发表于 2020-5-14 22:52
本帖最后由 赤座灯里 于 2020-5-15 02:17 编辑

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char input[20];
    int ret;
    int i; 
    int len;
    i = 0;
    ret = 0;
    printf("Please input key:\n");
    scanf("%s", input);
    len = strlen(input);
    if (len < 0 || len > 10) {
        LABEL_56:
        printf("Failed");
        return 0;
    }
    switch (len) {
        case 0:
            goto LABEL_5;
        case 1:
            goto LABEL_9;
        case 2:
            goto LABEL_13;
        case 3:
            goto LABEL_17;
        case 4:
            goto LABEL_21;
        case 5:
            goto LABEL_36;
        case 6:
            goto LABEL_40;
        case 7:
            goto LABEL_44;
        case 8:
            goto LABEL_48;
        case 9:
            break;
        default:
            goto LABEL_56;
    }
    while (input[i] != 'z') {
        if (input[i] != '/')
            goto LABEL_56;
        ++i;
        while (1) {
            LABEL_48:
            if (input[i] == 'h') {
                ++i;
                ret += 2;
                goto LABEL_9;
            }
            if (input[i] != 'r')
                break;
            ++i;
            ++ret;
            LABEL_44:
            if (input[i] == 'a') {
                ++i;
                ret += 3;
                goto LABEL_13;
            }
            if (input[i] == 'x') {
                ++i;
                ret += 2;
                LABEL_40:
                while (input[i] != 'y') {
                    if (input[i] != 'p')
                        goto LABEL_44;
                    ++i;
                    ++ret;
                    LABEL_36:
                    if (input[i] == '<') {
                        --ret;
                        goto LABEL_21;
                    }
                    if (input[i] == '+') {
                        ++i;
                        ++ret;
                        goto LABEL_9;
                    }
                }
                ++i;
                ++ret;
                goto LABEL_17;
            }
        }
    }
    ++i;
    ++ret;
    while (1) {
        LABEL_5:
        if (input[i] == 'z') {
            ++i;
            --ret;
            goto LABEL_48;
        }
        if (input[i] == 'q') {
            ++i;
            ++ret;
        }
        LABEL_9:
        if (input[i] == 'w') {
            ++i;
            ret += 2;
            goto LABEL_44;
        }
        if (input[i] == 'r') {
            ++i;
            ++ret;
        }
        LABEL_13:
        if (input[i] == 'x') {
            ++i;
            ++ret;
            goto LABEL_40;
        }
        if (input[i] == 'e') {
            ++i;
            ret += 4;
        }
        LABEL_17:
        if (input[i] == '!') {
            ++i;
            ++ret;
            goto LABEL_36;
        }
        if (input[i] != '+')
            break;
        ++i;
        ++ret;
    }
    LABEL_21:
    if (ret != 9) {
        printf("Failed");
        goto LABEL_56;
    }
    printf("Success!");
    return 0;
}

zzhwaxy
flag是猜的,不会去除这种控制流混淆。
这种东西写起来确实不难,按正确逻辑走一遍就行,逆起来就头疼了

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
CrazyNut + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

jiaocoll 发表于 2020-5-15 00:11
1.

2.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
CrazyNut + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

 楼主| zzhwaxy 发表于 2020-5-15 07:27
赤座灯里 发表于 2020-5-14 22:52
[mw_shl_code=c,true]#include
#include

离正确答案很接近了,但是还差一点
xiaohong 发表于 2020-5-15 09:58
支持一下,加密了的,一般复制不了
sadamo 发表于 2020-5-15 10:15
太好了,只需要这个
 楼主| zzhwaxy 发表于 2020-5-15 11:03
玖公子 发表于 2020-5-15 10:05
大佬太强了,我OD跟了半天,没找出正确的流程,用了你的,发现成功了。
flag是9位数:zzhwaxy!<

没想到你们这么快就解出来了。

不过,那个9其实是用来验证结果的,只是为了降低难度,刚巧和字符串长度一致。

源代码我已经在上面开放了。
赤座灯里 发表于 2020-5-15 11:47
zzhwaxy 发表于 2020-5-15 07:27
离正确答案很接近了,但是还差一点

按长度匹配必然导致多解,除非成功的逻辑和其他有明显差异
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 12:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表