解压附件之后,放到IDA里,先shift+F12打开字符串窗口,再按ctrl+f搜索flag
我们肯定是要找到正确的flag,那么我们就双击this is the right flag!
然后我们单击这一行,然后使用快捷键ctrl+x
选择ok,进入框图
使用快捷键F5
得到伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
int stat_loc; // [rsp+4h] [rbp-3Ch] BYREF
int i; // [rsp+8h] [rbp-38h]
__pid_t pid; // [rsp+Ch] [rbp-34h]
char s2[24]; // [rsp+10h] [rbp-30h] BYREF
unsigned __int64 v8; // [rsp+28h] [rbp-18h]
v8 = __readfsqword(0x28u);
pid = fork();
if ( pid )
{
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:");
__isoc99_scanf("%20s", s2);
if ( !strcmp(&flag, s2) )
result = puts("this is the right flag!");
else
result = puts("wrong flag!");
return result;
}
然后我们就可以读代码了,我们发现程序对flag与str2进行了比较
但是flag是什么我们还是不知道,那么我们就双击flag去看看flag到底是什么东西
flag是{hacking_for_fun}但是我们在读伪代码的时候又发现,这个flag是被操作过的
这里的意思是把变量flag = {hacking_for_fun} 进行转换,如果遇到105和114的话就转换成数字49,而105就是i,114就是r,49就是1连脚本都不用写,直接手动替换{hack1ng_fo1_fun}就得到了flag