BUUCTF 刮开有奖

这题有点抽象,动态调试断点总是下不对,只能静态做了v7那里原本是v7[2],可以看到是一片连续的内存,所以直接修改数组长度为11会好看很多,由于不会动态调试,甚至都搞不清楚那里是输入,看到input那里有一个比较长度的操作,于是判断他是输入,下面一个函数 sub_7210F0(v7, 0, 10);传入的v7,代码很长,但是可以从最后面看出这是对v7进行了更改(将函数的第一个参数改为int数组即可),直接复制伪代码,

#include<stdio.h>


sub_5210F0(int a1[], int a2, int a3);


int main()
{
  int a1[11]={90,74,83,69,67,97,78,72,51,110,103};
  int result; // eax
  int i; // esi
  int v5; // ecx
  int v6; // edx
  int a2=0;
  int a3=10;

  result = a3;
  result = a3;
  for ( i = a2; i <= a3; a2 = i )
  {
    v5 = i;
    v6 = a1[i];
    if ( a2 < result && i < result )
    {
      do
      {
        if ( v6 > a1[result] )
        {
          if ( i >= result )
            break;
          ++i;
          a1[v5] = a1[result];
          if ( i >= result )
            break;
          while ( a1[i] <= v6 )
          {
            if ( ++i >= result )
              goto LABEL_13;
          }
          if ( i >= result )
            break;
          v5 = i;
          a1[result] = a1[i];
        }
        --result;
      }
      while ( i < result );
    }
LABEL_13:
    a1[result] = v6;
    sub_5210F0(a1, a2, i - 1);
    result = a3;
    ++i;
  }
  for(int j=0;j<11;j++)
  {
    printf("%c",a1[j]);
  }
  
  return 0;
}


sub_5210F0(int a1[], int a2, int a3)
{
   int result; // eax
  int i; // esi
  int v5; // ecx
  int v6; // edx

  result = a3;
  result = a3;
  for ( i = a2; i <= a3; a2 = i )
  {
    v5 = i;
    v6 = a1[i];
    if ( a2 < result && i < result )
    {
      do
      {
        if ( v6 > a1[result] )
        {
          if ( i >= result )
            break;
          ++i;
          a1[v5] = a1[result];
          if ( i >= result )
            break;
          while ( a1[i] <= v6 )
          {
            if ( ++i >= result )
              goto LABEL_13;
          }
          if ( i >= result )
            break;
          v5 = i;
          a1[result] = a1[i];
        }
        --result;
      }
      while ( i < result );
    }
LABEL_13:
    a1[result] = v6;
    sub_5210F0(a1, a2, i - 1);
    result = a3;
    ++i;
  }
}

运行结果是3CEHJNSZagn,也就是新的v7。

然后这里是怎么判断出是base64操作的呢?我是看了一眼就直接gpt了然后事后诸葛亮一下

查看这个数组发现是个字符表,就是base64的默认数据,再结合下面的对比查看这个数组发现是个字符表,就是base64的默认数据,再结合下面的对比V9的长度为3,而比较的字符串长度却是4,这也很容易想到是base64编码。然后根据if里的判断可以得出输入的前四个值为UJWP,下面两个字符串进行base64解码

得到UJWP1jMp。

大佬们能讲讲这题动态调试为啥不得行吗 ^^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值