[Buuctf] [2019红帽杯] easyRE

在这里插入图片描述

1.查壳

在这里插入图片描述
64位elf文件,没有壳

2.用64位IDA打开

没有main函数,跟进start函数看一下
在这里插入图片描述
出现了几个函数
用Shift+F12查看字符串,查找flag无果
但是发现
在这里插入图片描述
有这样一些字符串,还有一个base64编码表,可以推测会有base64加密
双击字符串,跟进字符串的地址

在这里插入图片描述
发现了一堆字符串
在这里插入图片描述
双击黄色地方的代码可以跳转到字符串在代码中的位置,在一个函数中

__int64 sub_4009C6()
{
  __int64 result; // rax
  int i; // [rsp+Ch] [rbp-114h]
  __int64 v2; // [rsp+10h] [rbp-110h]
  __int64 v3; // [rsp+18h] [rbp-108h]
  __int64 v4; // [rsp+20h] [rbp-100h]
  __int64 v5; // [rsp+28h] [rbp-F8h]
  __int64 v6; // [rsp+30h] [rbp-F0h]
  __int64 v7; // [rsp+38h] [rbp-E8h]
  __int64 v8; // [rsp+40h] [rbp-E0h]
  __int64 v9; // [rsp+48h] [rbp-D8h]
  __int64 v10; // [rsp+50h] [rbp-D0h]
  __int64 v11; // [rsp+58h] [rbp-C8h]
  char v12[13]; // [rsp+60h] [rbp-C0h] BYREF
  char v13[4]; // [rsp+6Dh] [rbp-B3h] BYREF
  char v14[19]; // [rsp+71h] [rbp-AFh] BYREF
  char v15[32]; // [rsp+90h] [rbp-90h] BYREF
  int v16; // [rsp+B0h] [rbp-70h]
  char v17; // [rsp+B4h] [rbp-6Ch]
  char v18[72]; // [rsp+C0h] [rbp-60h] BYREF
  unsigned __int64 v19; // [rsp+108h] [rbp-18h]

  v19 = __readfsqword(0x28u);
  qmemcpy(v12, "Iodl>Qnb(ocy", 12);
  v12[12] = 127;
  qmemcpy(v13, "y.i", 3);
  v13[3] = 127;
  qmemcpy(v14, "d`3w}wek9{iy=~yL@EC", sizeof(v14));
  memset(v15, 0, sizeof(v15));
  v16 = 0;
  v17 = 0;
  sub_4406E0(0LL, v15, 37LL);
  v17 = 0;
  if ( sub_424BA0(v15) == 36 )
  {
    for ( i = 0; i < (unsigned __int64)sub_424BA0(v15); ++i )
    {
      if ( (unsigned __int8)(v15[i] ^ i) != v12[i] )
      {
        result = 4294967294LL;
        goto LABEL_13;
      }
    }
    sub_410CC0("continue!");
    memset(v18, 0, 65);
    sub_4406E0(0LL, v18, 64LL);
    v18[39] = 0;
    if ( sub_424BA0(v18) == 39 )
    {
      v2 = sub_400E44(v18);
      v3 = sub_400E44(v2);
      v4 = sub_400E44(v3);
      v5 = sub_400E44(v4);
      v6 = sub_400E44(v5);
      v7 = sub_400E44(v6);
      v8 = sub_400E44(v7);
      v9 = sub_400E44(v8);
      v10 = sub_400E44(v9);
      v11 = sub_400E44(v10);
      if ( !(unsigned int)sub_400360(v11, off_6CC090) )
      {
        sub_410CC0("You found me!!!");
        sub_410CC0("bye bye~");
      }
      result = 0LL;
    }
    else
    {
      result = 4294967293LL;
    }
  }
  else
  {
    result = 0xFFFFFFFFLL;
  }
LABEL_13:
  if ( __readfsqword(0x28u) != v19 )
    sub_444020();
  return result;
}

首先是异或加密
在这里插入图片描述
我们写一个python脚本将加密的数据异或解密

v12="Iodl>Qnb(ocy"
v12=list(v12)
for i in range(0,len(v12)):
    v12[i]=ord(v12[i])
v12.append(127)

v13="y.i"
v13=list(v13)
for i in range(0,len(v13)):
    v13[i]=ord(v13[i])
v12.extend(v13)
v12.append(127)

v14="d`3w}wek9{iy=~yL@EC"
v14=list(v14)
for i in range(0,len(v14)):
    v14[i]=ord(v14[i])
v12.extend(v14)

print(v12)
v15=''
for i in range(0,len(v12)):
    v15+=chr(v12[i]^i)

print(v15)
>>>Info:The first four chars are `flag`

结果是提供提示信息:前四个字符是flag
继续向下分析
在这里插入图片描述
这里用了10次相同的函数,函数作用是base64加密
最后判断v11off_6cc090是否相等,我们双击off_6cc090查看其内容
在这里插入图片描述
发现它就是那一大串字符串,接下来就是把它进行10次b64解密

v11='''Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl
    5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0
     pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNR
     lZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxi
     R1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9
     hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOV
     hXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6R
     mFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=='''
v10=base64.b64decode(v11)
v9=base64.b64decode(v10)
v8=base64.b64decode(v9)
v7=base64.b64decode(v8)
v6=base64.b64decode(v7)
v5=base64.b64decode(v6)
v4=base64.b64decode(v5)
v3=base64.b64decode(v4)
v2=base64.b64decode(v3)
v18=base64.b64decode(v2)
print(v18)b'https://bbs.pediy.com/thread-254172.htm'
>>>

结果是一个网页,进去看看
在这里插入图片描述
OMG!!是看雪论坛的一个文章,说明我们找错了。
找其他突破口
在这里插入图片描述
在那个字符串的地址的下面还有一些数据跟进去看看
在这里插入图片描述
双击黄色位置
进入了一个新的函数
在这里插入图片描述
关键部位就是画红线的位置102和103分别对应的字符是fg,看到f和g突然想到了falg,而这里正好f和g中间相差两个字符,就确定了是flag中的f,g。
接着可以推出v4数组了,然后就能够通过异或拿到falg。
在这里插入图片描述
接下来写脚本,运行

byte_6cc0a0=[0x40,0x35,0x20,0x56,0x5d,0x18,0x22,0x45,0x17,0x2f,0x24,0x6e,0x62,0x3c,0x27,0x54,0x48,0x6c,0x24,0x6e,0x72,0x3c,0x32,0x45,0x5b]
tmp=[102,108,97,103]
for i in range(0,4):
    v1.append(tmp[i]^byte_6cc0a0[i])
print(v1)
>>>[38, 89, 65, 49]
flag=''
for i in range(0,25):
    flag+=chr(byte_6cc0a0[i]^v1[i%4])
print(flag)
>>>flag{Act1ve_Defen5e_Test}

拿到flag,提交,提交成功!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值