buuctf_reverse3

reverse3

每日一道reverse的题,可多不能少

打开题目先检查有无壳,以及多少位的,这题是没有壳的就不做过多的演示了,所以我们直接进入主题。

打开IDA,用shift+F12搜索字符串
在这里插入图片描述
发现其中的关键字
在这里插入图片描述
然后双击进入
在这里插入图片描述
这里我们首先要先选中一个函数然后按ctrl+X,然后再按F5进入反汇编,这里可以很直观的看到这里应该就是一个main函数。
在这里插入图片描述
这里我们先来分析一下这一段程序的简单逻辑
首先接收一个输入的字符串
在这里插入图片描述
然后要经过一个加密函数
在这里插入图片描述
这里我们跟进一下这个加密函数
源代码

int __cdecl sub_411AB0(char *a1, unsigned int a2, _DWORD *a3)
{
  int v4; // [sp+Ch] [bp-100h]@1
  int v5; // [sp+D4h] [bp-38h]@7
  int i; // [sp+E0h] [bp-2Ch]@7
  int v7; // [sp+ECh] [bp-20h]@1
  void *Dst; // [sp+F8h] [bp-14h]@1
  char *v9; // [sp+104h] [bp-8h]@1

  memset(&v4, 0xCCu, 0x100u);
  v9 = 0;
  Dst = 0;
  v7 = 0;
  if ( a1 && a2 )
  {
    v7 = a2 / 3;
    if ( (a2 / 3) % 3 )
      ++v7;
    v7 *= 4;
    *a3 = v7;
    malloc(v7 + 1);
    Dst = sub_411127();
    if ( Dst )
    {
      j_memset(Dst, 0, v7 + 1);
      v9 = a1;
      v7 = a2;
      i = 0;
      v5 = 0;
      while ( v7 > 0 )
      {
        byte_41A144[2] = 0;
        byte_41A144[1] = 0;
        byte_41A144[0] = 0;
        for ( i = 0; i < 3 && v7 >= 1; ++i )
        {
          byte_41A144[i] = *v9;
          --v7;
          ++v9;
        }
        if ( !i )
          break;
        v4 = i;
        if ( i == 1 )
        {
          *(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
          *(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
          *(Dst + v5++) = aAbcdefghijklmn[64];
          *(Dst + v5++) = aAbcdefghijklmn[64];
        }
        else if ( v4 == 2 )
        {
          *(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
          *(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
          *(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
          *(Dst + v5++) = aAbcdefghijklmn[64];
        }
        else if ( v4 == 3 )
        {
          *(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
          *(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
          *(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
          *(Dst + v5++) = aAbcdefghijklmn[byte_41A144[2] & 0x3F];
        }
      }
      *(Dst + v5) = 0;
    }
  }
  return sub_411127();
}

在代码的下部分,可以看到Dst会经过aAbcdefghijklmn[]数组的变换,打开此处
在这里插入图片描述
从’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='可以看出,这个函数应该是base64的加密函数,因此只需要解密即可。
这里贴上一个脚本.

import base64
str1 = "e3nifIH9b_C@n@dH"

flag = ""

s = ""

for i in range(0,len(str)):
    s += chr(ord(str1[i]) - i)

flag = base64.b64decode(s)
flag = flag.decode('ASCII')
print(flag)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值