【re】BUUCTF [GXYCTF2019]luck_guy

题目:BUUCTF [GXYCTF2019]luck_guy


无壳,64位,ida打开找找找到get_flag()函数

for ( i = 0; i <= 4; ++i )
  {
    switch ( rand() % 200 )
    {
      case 1:
        puts("OK, it's flag:");
        memset(s, 0, sizeof(s));
        strcat((char *)s, f1);
        strcat((char *)s, &f2);
        printf("%s", (const char *)s);
        break;
      case 2:
        printf("Solar not like you");
        break;
      case 3:
        printf("Solar want a girlfriend");
        break;
      case 4:
        strcpy((char *)s, "icug`of\x7F");
        strcat(&f2, (const char *)s);
        break;
      case 5:
        for ( j = 0; j <= 7; ++j )
        {
          if ( j % 2 == 1 )
            *(&f2 + j) -= 2;
          else
            --*(&f2 + j);
        }
        break;
      default:
        puts("emmm,you can't find flag 23333");
        break;
    }

是用随机数决定的操作
case1中可以看到,s是flag,由f1和f2拼接而成,双击f1得到
在这里插入图片描述至于f2,在case4中可以看到(把那一串奇怪的数字转成char并翻转一下),但看着还是不像正常的字符串
再看到case5中对f2进行了长度为8的操作,于是猜是要对f2操作后再拼接起来得到flag
写出来试试

char s[100] = "icug`of\x7F\0";
char *f2 = s;
for (int j = 0; j <= 7; ++j )
{
  if ( j % 2 == 1 )
    *(f2 + j) -= 2;
  else
    --*(f2 + j);
	//cout << *(&f2)
}
cout << s << endl;

得到
在这里插入图片描述
拼起来得到GXY{do_not_hate_me},这就很像flag了,去交交
flag是flag{do_not_hate_me}

靠运行程序得到的话也就是要先随机到4给f2赋值,再随到5对f2进行加工,最后到1进行拼接并输出flag,不知道有没有真的能随机出来的幸运儿呢

你可能感兴趣的:(ctf,reverse,逆向工程,buuctf)