题目: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,不知道有没有真的能随机出来的幸运儿呢