查壳64位,打开主函数,点开patch_me查看
点开后继续点get_flag看到关键函数代码
unsigned __int64 get_flag()
{
for ( i = 0; i <= 4; ++i )
{
switch ( rand() % 200 ) //当初还想把这里改成1直接获得flag,我还是太年轻,做不来啊
{
case 1:
puts("OK, it's flag:");
memset(&s, 0, 0x28uLL); //清0s对应的内存空间
strcat((char *)&s, f1); //GXY{do_not_
strcat((char *)&s, &f2);
printf("%s", (const char *)&s); //这里打印flag,但f2的内容在下面才可以看到
break;
case 2:
printf("Solar not like you");
break;
case 3:
printf("Solar want a girlfriend");
break;
case 4:
s = 0x7F666F6067756369LL; //按r转换后 '\x7Ffo`guci' 注意逆序才是正确的字符串
v5 = 0; //\x7F是十六进制7F,要特别处理
strcat(&f2, (const char *)&s);
break;
case 5:
for ( j = 0; j <= 7; ++j ) //这里是对s进行操作,经加密后得到flag
{
if ( j % 2 == 1 )
*(&f2 + j) -= 2;
else
--*(&f2 + j);
}
break;
default:
puts("emmm,you can't find flag 23333");
break;
}
}
return __readfsqword(0x28u) ^ v6;
}
解密:
#include <stdio.h>
int main()
{
char s[9]="icug`of";
s[7]=0x7F; //单独处理
for (int j = 0; j <=7; ++j )
{
if ( j % 2 == 1 )
s[j] -= 2;
else
--s[j];
}
puts(s); //得到hate_me}
return 0;
}
得到flagGXY{do_not_hate_me}