吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4121|回复: 12
收起左侧

[CrackMe] 朋友丢给我的一个CTF的CM

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

本帖最后由 52_aha 于 2017-9-27 22:33 编辑

日文,追到关键部分,一大群跳转实在是看不懂了


提示:如果使用od可以搜索如下字符串,但是x64dbg搜索不到,不过自己跟着看一下也很好找到这里的
[Asm] 纯文本查看 复制代码
痛いQAQ                               痛
ああ..疲れた....                       啊啊。累了
本当に 本当に よかった       真的真的是太好了
违うよ                                  不同的啊


这些日文翻译过来总有点怪怪的感觉?

本帖子中包含更多资源

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

x

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

whklhh 发表于 2017-9-28 00:07
本帖最后由 whklhh 于 2017-9-28 00:10 编辑

这种题目用IDA会比较好啦~
走迷宫是比较常见的CTF套路了呢

首先按照字符串找到核心函数sub4015F3
不过在这之前,试输入会出现违xxx(不同的啊~,不太对劲啊~)的句子,这是在sub_4017B8处判断的
该函数检测开头五个字符和最后一个字符是否为xman{、},估计是比赛的名字吧

然后核心函数的代码是
[C++] 纯文本查看 复制代码
int __cdecl sub_4015F3(char *a1)
{
  signed int v1; // eax@2
  size_t v2; // ebx@17
  int result; // eax@19
  char v4; // [sp+4h] [bp-64h]@0
  int v5; // [sp+1Ah] [bp-4Eh]@1
  int v6; // [sp+1Eh] [bp-4Ah]@1
  char v7; // [sp+22h] [bp-46h]@1
  int v8; // [sp+23h] [bp-45h]@1
  int v9; // [sp+27h] [bp-41h]@1
  char v10; // [sp+2Bh] [bp-3Dh]@1
  int v11; // [sp+2Ch] [bp-3Ch]@1
  int v12; // [sp+30h] [bp-38h]@1
  char v13; // [sp+34h] [bp-34h]@1
  int input; // [sp+35h] [bp-33h]@1
  int v15; // [sp+39h] [bp-2Fh]@1
  char v16; // [sp+3Dh] [bp-2Bh]@1
  int v17; // [sp+3Eh] [bp-2Ah]@1
  int v18; // [sp+42h] [bp-26h]@1
  char v19; // [sp+46h] [bp-22h]@1
  int v20; // [sp+47h] [bp-21h]@1
  int v21; // [sp+4Bh] [bp-1Dh]@1
  char v22; // [sp+4Fh] [bp-19h]@1
  int v23; // [sp+50h] [bp-18h]@1
  int v24; // [sp+54h] [bp-14h]@1
  size_t i; // [sp+58h] [bp-10h]@1
  char flag; // [sp+5Fh] [bp-9h]@1

  v5 = 0x5202020;
  v6 = 0x20202020;
  v7 = 0;
  v8 = 0x5200520;
  v9 = 0x20050520;
  v10 = 0;
  v11 = 0x20050520;
  v12 = 0x20200520;
  v13 = 0;
  input = 0x20200520;
  v15 = 0x20052020;
  v16 = 0;
  v17 = 0x5200520;
  v18 = 0x5050520;
  v19 = 0;
  v20 = 0x5202020;
  v21 = 0x20202020;
  v22 = 0;
  v24 = 0;
  v23 = 0;
  flag = 1;
  for ( i = 0; ; ++i )
  {
    v2 = i;
    if ( v2 >= strlen(a1) )
      break;
    v1 = a1;
    if ( v1 == 50 )                             // 2
    {
      flag = sub_40157C((int)&v24, &v23);       // v23+1,v23<=7
      goto LABEL_14;
    }
    if ( v1 > 50 )
    {
      if ( v1 == 51 )                           // 3
      {
        flag = sub_4015A4(&v24);                // v24-1, v24>=0
        goto LABEL_14;
      }
      if ( v1 == 52 )                           // 4
      {
        flag = sub_4015CB(&v24);                // v24+1,v24<=7
        goto LABEL_14;
      }
    }
    else if ( v1 == 49 )                        // 1
    {
      flag = sub_401555((int)&v24, &v23);       // v23-1, v23>=0
      goto LABEL_14;
    }
    flag = 0;
LABEL_14:
    if ( (unsigned __int8)sub_401529((int)&v5, v24, v23) ^ 1 )// (a1+9*a2+a3)==32
                                                // v24=y
                                                // v25=x
    {
      flag = 0;
      break;
    }
  }
  if ( flag == 1 )
  {
    if ( v24 != 5 || v23 != 7 )                 // 谁来救救我
    {
      result = sub_401500(&unk_489033, v4);
    }
    else if ( strlen(a1) <= 0x10 )
    {
      result = sub_401500("本当に 本当に よかった\n", v4);// 太好啦
    }
    else
    {
      result = sub_401500(&"ああ..疲れた....\n", v4);// 累死啦
    }
  }
  else
  {
    result = sub_401500("痛いQAQ\n", v4);       // 好痛!
  }
  return result;
}


开头处用十六进制可以看出来05和20两种字节,用python跑一下就能生成地图:
[Python] 纯文本查看 复制代码
a = '052020202020202005200520200505202005052020200520202005202005202005200520050505200520202020202020'
s = ''
w = ''
for i in range(len(a)):
    # print(s)
    if(i%2):
        s += a
        if(s=='20'):
            w += '0'
        else:
            w += '1'

        s = ''
    else:
        if(i%8==0):
            print(w[::-1], end='')
            w=''
        s += a
        if(i%16==0):
            print()
print(w[::-1])


生成的地图样子是:
00010000
01010110
01100100
01000010
01010111
00010000

刚开始我直接搞上去还没反应过来╮(╯_╰)╭其实0x05202020有个大小端序的问题,所以需要倒过来来着

flag是标识,v24是y值,v23是x值
1234分别代表上下左右的移动

05代表刺儿君,20代表可走的路
如果撞到刺儿君就会把flag赋0,提示“好痛~”
如果指令走完了还没到达终点(右下角,即(5,7)),会提示“谁来救救我呀~”
如果走到终点但是消耗步数超过16步,提示“哎呀太累啦……”
如果在16步以内走到终点才会提示"真的真的太好啦"
(16步应该是最短不回头的步数,来保证flag唯一)

以前做过不少类似的题目啦,不过像这位作者一样辣么可爱的提示还没见过呢~很有趣~~

大体的情况就是这样,IDA导出的代码慢慢分析一下就行啦~
有不懂的欢迎继续交流=-=我也是CTF Re方向的菜鸡~

免费评分

参与人数 3吾爱币 +2 热心值 +2 收起 理由
Ravey + 1 谢谢@Thanks!
6767 + 1 + 1 我很赞同!
LiMitZhang + 1 666

查看全部评分

zbnysjwsnd8 发表于 2017-9-28 20:51
whklhh 发表于 2017-9-28 00:07
这种题目用IDA会比较好啦~
走迷宫是比较常见的CTF套路了呢

20 20 20 05 20 20 20 20 00 //第零行
20 05 20 05 20 05 05 20 00 //第一行
20 05 05 20 20 05 20 20 00 //第二行
20 05 20 20 20 20 05 20 00 //第三行
20 05 20 05 20 05 05 05 00 //第四行
20 20 20 05 20 20 20 20      //第五行
                               ↑
                            成功
whklhh 发表于 2017-9-28 00:14
哦哦还有
flag是xman{4444422332244222}

不过我想着xman挺耳熟的……
查了一下果然之前暑假听说有第二期XMAN夏令营来着
为啥还是日本友人出的题目
 楼主| 52_aha 发表于 2017-9-28 00:25
whklhh 发表于 2017-9-28 00:14
哦哦还有
flag是xman{4444422332244222}

谢谢啦,十分感谢,学到了不少,其实我不是玩ctf的,朋友说我在学这个就丢了几个cm。。。。前几个我用x32dbg倒是比较好分析,这个一大群乱跳真的是看晕了,我还没接触过ida
 楼主| 52_aha 发表于 2017-9-28 00:26
whklhh 发表于 2017-9-28 00:14
哦哦还有
flag是xman{4444422332244222}

红多利红多利由噶哒。。。。这是那个成功的提示语,哈哈,我还专门查了
whklhh 发表于 2017-9-28 00:26
突然发现虽然楼主没有给出“誰か助けてー”的翻译,我却已经自动把它翻译出“谁来救救我--”了……………………我已经这么死宅了吗
whklhh 发表于 2017-9-28 00:29
52_aha 发表于 2017-9-28 00:25
谢谢啦,十分感谢,学到了不少,其实我不是玩ctf的,朋友说我在学这个就丢了几个cm。。。。前几个我 ...

这种比较偏算法的类型适合静态分析~
OD的动态调试比较适合细节上的关注,跟着乱跳很容易懵逼
IDA对整个函数的框架把握就比较有帮助了~
 楼主| 52_aha 发表于 2017-9-28 00:31
whklhh 发表于 2017-9-28 00:26
突然发现虽然楼主没有给出“誰か助けてー”的翻译,我却已经自动把它翻译出“谁来救救我--”了……………… ...

哈哈,我忘记写上了答主可以一起交流下吗,企鹅MTA3NTc2ODA5NA==
呵呵注册 发表于 2017-9-28 09:27
这企鹅放的...我还要去解码才知道- -
黑龍 发表于 2017-9-28 17:28
你朋友是日本人?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

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

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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