buuctf——[2019红帽杯]easyRE

文章讲述了在使用IDApro进行逆向工程时,作者详细描述了如何通过查找字符串、分析函数调用和理解Base64编码来解决一个具有挑战性的代码问题。关键在于理解函数内部逻辑和字符串操作对找到flag的重要性。
摘要由CSDN通过智能技术生成

题目链接

查壳

发现什么都没有

进入IDA pro

shift+f12 查找字符串后,发现这三个

查看调用

__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;
}

用AI帮我们看了下,发现用处不是很大,但是其中有很有调用函数,这些奥妙应该都在函数里面藏着了。

从头开始慢慢看(不建议逆向看,容易断)

(中间有些函数我改了名字(按N)方便我阅读)

这是脚本,我先摆出来,再一一说明

IDA确实很强大,但是里面的不可能百分百正确

根据这个代码,你可能会困惑,为什么V12有36位,从C语言中看不出来

我们回到汇编代码

它就是完全按照地址加的,那两个端点(加上127那两个,让IDA分析错误了)

所以其实这全部加上 36位,刚好对应函数要求的36位

这是得到的信息(前四个字符是flag)

接下来又是一段操作(有些函数名字被我改了)

我们可以看见,输入v18后,然后对他进行10次操作

这个操作是什么呢?

我们跟进看看

说实话,我看不懂。

但是他又调用了一个函数

我们再跟进一些(base64)

这个ABCD后面跟着数字,是base64的标志

我们也就只能默认这个是进行base64加密了

这篇文章讲了base64

当然,客观来讲,这太不负责任了,但是就我们的知识和能力,如果它还加上什么的话,已经超出我们的能力范围了,而且也不可能放在这么前面的题目单上面。

这段代码不用解释吧,遇到这么多次了,就是比较

我们根据off

后面这么长一床- -,服了

shift+e调用出来,准备写脚本吧

得到一个网址

点进去是这个

发现对解题用处不是很大

没办法,继续看看吧

应该是那么一大串字符的原因

前面的思路应该都没错,要么是我们开始的思路就错了要么就是这个字符串的问题,但是base64后给了一个正确的网址,出题人肯定也想到这一步,说明我们大体思路没错的。

最后的答案是根据off后

下面这些关键词的调用才能得到真正的flag(具体为什么,我感觉这道题比较非常规,但是想想我们都是搞逆向的了,人家肯定要防止我们破解啊,搞这些障眼法感觉也是情理之中)

这就是调用的那个代码

我们可以看到,最后判断 f和g

再想到之前作者最开始说前四个字符是flag

肯定有蹊跷

看这段赋值

两个f和g之间刚好有两个值

我们按这个思路走(所有正确答案都是试错弄出来的)

脚本如下:

真难,下班下班。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Nickname

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值