BUUCTF Reverse/[ACTF新生赛2020]SoulLike

BUUCTF Reverse/[ACTF新生赛2020]SoulLike

在这里插入图片描述

看下文件信息,没有加壳

在这里插入图片描述

IDA64位打开,还是字符串比较题目

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  __int64 result; // rax
  char v5; // [rsp+7h] [rbp-B9h]
  int i; // [rsp+8h] [rbp-B8h]
  int j; // [rsp+Ch] [rbp-B4h]
  int v8[14]; // [rsp+10h] [rbp-B0h] BYREF
  char v9[110]; // [rsp+4Ah] [rbp-76h] BYREF
  unsigned __int64 v10; // [rsp+B8h] [rbp-8h]

  v10 = __readfsqword(0x28u);
  printf("input flag:");
  scanf("%s", &v9[6]);
  strcpy(v9, "actf{");
  v5 = 1;
  for ( i = 0; i <= 4; ++i )
  {
    if ( v9[i] != v9[i + 6] )
    {
      v5 = 0;
      goto LABEL_6;
    }
  }
  if ( !v5 )
    goto LABEL_16;
LABEL_6:
  for ( j = 0; j <= 11; ++j )
    v8[j] = v9[j + 11];
  if ( (unsigned __int8)sub_83A(v8) && v9[23] == 125 )
  {
    printf("That's true! flag is %s", &v9[6]);
    result = 0LL;
  }
  else
  {
LABEL_16:
    printf("Try another time...");
    result = 0LL;
  }
  return result;
}

逻辑很简单,是以 actf{} 包裹的flag,且括号里面的字符为12位

这里就是输出flag的条件了

 if ( (unsigned __int8)sub_83A(v8) && v9[23] == 125 )
  {
    printf("That's true! flag is %s", &v9[6]);
    result = 0LL;
  }

sub_83A(v8)对括号里面的12位字符进行变换,但在跟进的时候出了个小问题,说啥太大了

在这里插入图片描述

百度了一下,可以修改配置文件IDA 7.0\cfg\hexrays.cfg来解决

在这里插入图片描述

可编译的最大函数大小为64k,然后改成1024(这个随意,,不过不知道具体要改大多少,这函数确实挺大的,,一整个蓝条都是)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改后就能正常反编译了,,,函数是在是太太太长了,完整的就不贴了,贴个开头和结尾意思意思。

在这里插入图片描述

结尾这里,变换后的字符串要等于v3,不然输出wrong

在这里插入图片描述

显而易见只能爆破了,太长了,只贴主要的

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int v[]={126,50,37,88,89,107,53,110,0,19,30,56};
int f(char *a1,int i)
{
  *a1 ^= 0x2Bu;
  a1[1] ^= 0x6Cu;
  a1[2] ^= 0x7Eu;
  a1[3] ^= 0x56u;
  ...
  ...
  ...
   a1[9] ^= 0x70u;
  a1[10] ^= 0x29u;
  a1[11] ^= 0x3Bu;
  if(a1[i] == v[i])
     return 1;
  else
    return 0;
}
int main()
{
    int i,j,k;
    char flag[13] = "";
    char temp[13] = "";
    for(i = 0; i < 12 ; i++)
    {
        for(k = 33; k <= 126 ; k++)
        {
            strcpy(flag,temp);
            flag[i] = k;
            if(f(flag,i))
            {
                temp[i] = k;
                break;
            }
        }
    }
    printf("flag{%s}\n",temp);
    return 0;
}

运行结果

在这里插入图片描述

flag{b0Nf|Re_LiT!}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ofo300

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

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

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

打赏作者

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

抵扣说明:

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

余额充值