i春秋-网络与信息安全专项赛部分题目write up

逆向

flat

进入IDA分析,找到主函数,F5查看伪代码
在这里插入图片描述
里面存在好几个while循环和if判断,而且数值特别大。
再往下看,下面还会输出“what a shame!!!”,意思是好可惜啊,可以判断,如果输出这句话,就说明我们错了,所以,通过上面的条件将这句话跳过去。
在这里插入图片描述
可以看出来,当if(v4&1)成立时,v5会重新赋值,v16也会变,不满足下面的判断,执行“break”,从而跳过这句话。所以说,v4=1。
在这里插入图片描述
接下来会调到一个switch语句中去,而且他通过不断地判断来更改v16的值,从而进入不同的case中。
经过分析,他一改先进入第七个case,通过if判断,进入第六个case,再通过if判断,来到switch上方的if语句出,从而跳过if的break;接着过if判断,进入第二个case,经过if,进入第四个判断,然后输出“you get it !”,成功。
所以他们需要满足fun_check1到5返回值均为1。
主要函数有4个(1没太大作用),其中2,3,4比较简单,作用如下
在这里插入图片描述
在这里插入图片描述
我们进入函数5,

s = a1;
  seven = a2;
  v12 = 0;
  v11 = -624695604;
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        while ( 1 )
        {
          while ( 1 )
          {
            while ( 1 )
            {
              while ( 1 )
              {
                while ( 1 )
                {
                  while ( 1 )
                  {
                    while ( 1 )
                    {
                      while ( 1 )
                      {
                        while ( 1 )
                        {
                          while ( 1 )
                          {
                            while ( 1 )
                            {
                              while ( 1 )
                              {
                                while ( 1 )
                                {
                                  while ( v11 == -1771681815 )
                                  {
                                    v6 = 1740029224;
                                    if ( s[v12] >= 'a' )
                                      v6 = -1207418117;
                                    v11 = v6;
                                  }
                                  if ( v11 != -1490231676 )
                                    break;
                                  ++v12;
                                  v11 = -768723158;
                                }
                                if ( v11 != -1407902233 )
                                  break;
                                v4 = -1188300396;
                                if ( s[v12] <= 57 )
                                  v4 = -478229440;
                                v11 = v4;
                              }
                              if ( v11 != -1207418117 )
                                break;
                              v7 = 1740029224;
                              if ( s[v12] <= 'z' )
                                v7 = 2096910144;
                              v11 = v7;
                            }
                            if ( v11 != -1188300396 )
                              break;
                            v5 = -1771681815;   // 插个眼  在此判断字母与-
                            if ( s[v12] == 45 )
                              v5 = -1167333891;
                            v11 = v5;
                          }
                          if ( v11 != -1167333891 )
                            break;
                          v13[v12] = s[v12];    // 如果s里是“-”就不做处理
                          v11 = -118846692;
                        }
                        if ( v11 != -995934932 )
                          break;
                        v3 = -1188300396;
                        if ( s[v12] >= '0' )    // 第一次 s[0]
                          v3 = -1407902233;     // 第二次来  s【1】
                        v11 = v3;               // 第三次来 s[2]
                      }
                      if ( v11 != -991718889 )
                        break;
                      v11 = -1490231676;
                    }
                    if ( v11 != -768723158 )
                      break;
                    v8 = 1681851953;
                    if ( v12 < 36 )
                      v8 = 434013166;
                    v11 = v8;
                  }
                  if ( v11 != -624695604 )
                    break;
                  v2 = 659899916;
                  if ( v12 < 36 )
                    v2 = -995934932;
                  v11 = v2;
                }
                if ( v11 != -478229440 )
                  break;
                v13[v12] = s[v12] + 17;         // 如果s里面有数字,则加17变为大写字母
                v11 = 1926387427;
              }
              if ( v11 != -451717645 )
                break;
              ++v12;
              v11 = -624695604;
            }
            if ( v11 != -118846692 )
              break;
            v11 = 1926387427;
          }
          if ( v11 != 329160926 )
            break;
          v16 = 0;
          v11 = 1269730414;
        }
        if ( v11 != 434013166 )
          break;
        v9 = -991718889;
        if ( v13[v12] != seven[v12] )
          v9 = 329160926;
        v11 = v9;
      }
      if ( v11 != 659899916 )
        break;
      v12 = 0;
      v11 = -768723158;
    }
    if ( v11 == 1269730414 )
      break;
    switch ( v11 )
    {
      case 1681851953:
        v16 = 1;
        v11 = 1269730414;
        break;
      case 1740029224:
        v11 = -118846692;
        break;
      case 1926387427:
        v11 = -451717645;
        break;
      case 2096910144:
        v13[v12] = s[v12] - 1347911315 + 1347911267;// 小写字母-48 变成数字
        v11 = 1740029224;
        break;
    }
  }
  return v16 & 1;
}

经过多次循环,可以看出,该函数主要有三点功能,

  1. 当输入为小写字母时,将其减48,变为数字
  2. 当输入为数字是,加17,变为大写字母
  3. 输入为‘-’时,不变
    变化后的字符串,与主函数里的dest字符串比较,可以直接写脚本了
s="J2261C63-3I2I-EGE4-IBCC-IE41A5I5F4HB"
flag=""
for k in s:
	i=ord(k)
	if i==45:
		flag=flag+chr(i)
	elif i>=48 and i<=57:
		flag=flag+chr(i+48)
	elif i>=65 and i<=90:
		flag=flag+chr(i-17)
print(flag)

解得flag:flag{9bbfa2fc-c8b8-464d-8122-84da0e8e5d71}

Misc

签到题

坑爹的签到题,以前没遇见过这种类型的,在这里插入图片描述
得到flag

24word

下载压缩包,解压缩,有一张图片,上书二十四真言,是社会主义核心价值观,作为社会主义新青年,我们知道,这是社会主义核心价值观加密。
在这里插入图片描述
网上找在线解密,不知道为什么,全都输进去解不出来,只能几个几个的试,经过无数次尝试,解出密码,CodeValues。这不是flag,继续。
一张png图片,binwalk一下,里面有东西,分析出来,又是一个压缩包,还有密码。
找伪加密,不是。将上步解出的密码输入,对了。
又是一张图片,还是二十四字真言,
在这里插入图片描述
中间的东西看着就像二维码,扫一下,没反应,ps编辑,放大,在扫,flag出来了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值