可能是世界上第一张木制银行卡

# 现可免费申请,无工本费、快递费、年费,中国可送达。

> 传送门:TreeCard

WriteUp

下载题目附件,得到一个部分加密的压缩包veryeasy.zip,其中未加密的文本文件你猜呀.txt内容为:INbRdP5NtO5JWP53rO5JcRbRgQKc+,先猜测是base64编码,但是解码失败了,于是就拿工具挨个去试,发现用xx编码进行解密并不会出现乱码,所以先猜测是xx编码,得到fwilvyhublqwhuhvwlqj

这种就很像栅栏或者古典字符替换类的密码了,试了一下栅栏,各种栏数都不是可读明文,于是去试了一下古典字符替换类密码中最经典的凯撒密码,在偏移为3时得到可读明文ctfisveryinteresting

使用上述密码解压,得到等一下,我密码呢.rar,再次解压得到reverse文件。

查看文件头为ELF,可知是二进制程序,直接ida进行静态分析。

没有任何入口伪装,主要代码就在main函数中,内容如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  int stat_loc; // [rsp+4h] [rbp-3Ch]
  int i; // [rsp+8h] [rbp-38h]
  __pid_t pid; // [rsp+Ch] [rbp-34h]
  char s2; // [rsp+10h] [rbp-30h]
  unsigned __int64 v8; // [rsp+28h] [rbp-18h]

  v8 = __readfsqword(0x28u);
  pid = fork();
  if ( pid )
  {
    argv = (const char **)&stat_loc;
    waitpid(pid, &stat_loc, 0);
  }
  else
  {
    for ( i = 0; i <= strlen(&flag); ++i )
    {
      if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
        *(&flag + i) = 49;
    }
  }
  printf("input the flag:", argv);
  __isoc99_scanf("%20s", &s2);
  if ( !strcmp(&flag, &s2) )
    result = puts("this is the right flag!");
  else
    result = puts("wrong flag!");
  return result;
}

其中flag变量为{hacking_for_fun}。分析代码可知,将flag变量处理后,就直接进行输入等价判断,所以处理后的flag值就是flag。处理循环如下:

{
    if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
        *(&flag + i) = 49;
}

可以发现就是简单的指定字符替换,将ir替换成1,所以手动替一下就能得到flag。

flag

{hack1ng_fo1_fun}


什么都会,但又什么都不会。