拿到题目后,尝试放进ida32发现不能运行,于是放进ida64,main函数,f5
v17 = __readfsqword(0x28u);
printf("Please input your flag:", argv, envp);
scanf("%s", &v7);
*(_QWORD *)v8 = 0LL;
memset(&v9, 0, 0x58uLL);
v10 = 0;
*(_QWORD *)v11 = 0LL;
memset(&v12, 0, 0x58uLL);
v13 = 0;
*(_QWORD *)v14 = 0LL;
memset(&v15, 0, 0x58uLL);
v16 = 0;
_substr666(v8, &v7, 0, 6);
_substr666(v11, &v7, 7, 6);
v3 = &v7;
_substr666(v14, &v7, 6, 1);
v4 = 0;
if ( (unsigned __int8)_0x233333(v8) )
{
v3 = &v6;
if ( (unsigned __int8)_0x666666(v11, &v6) )
{
if ( (unsigned __int8)_0x8048000(v14) )
v4 = 1;
}
}
if ( v4 )
printf("Unbelievable! Congratualation!", v3);
else
printf(aSorryTryAgain, v3);
return 0;
}
可以看到v7是需要输入的
看到出现3个_substr666,点击进去
发现三段程序都差不多,解第一段
返回上一步知道传进去的实参分别是v8,v7,0,6,分别对应a1,a2,a3,a4
for循环,对应将v7的第1~6位放进v8
for(i=0;i<6;i++)
{
v4=v6++;
a1[v4]=a2[i];
}
之后两个操作也是一样
第二个操作对应将v7的8~13位放进v11;第三个操作对应将v7的第7位放进v14,即v7被分割成三段
接下来的操作
分别点进_0x233333,_0x666666,_0x8048000可以知道分别对应v8,v11,v14的加密
_0x233333
看到同样的操作_substr666,点进str,发现是一个字符串vosng%_Ngemkt,这个操作是将str的8~13位放进s2,而接下来的for循环是将v8中每个字符加上4再与2异或之后赋给s1,最后比较s1与s2的值是否相等。
_0x666666
将str的1~6位放进s之后再一一赋值给a2,第二个for循环中对应将v11中每个字符加上j再减1之后赋值给v7,最后再比较v7与a2中的值是否相等。
_0x8048000
直接比较v14与下划线是否相等。
根据上面的思路,脚本
int main()
{
char a[14]="vosng%Ngemkt";
for(int i=7;i<13;i++)
{
cout<<char((a[i]^2)-4);
}
cout<<"";
for(int i=0;i<6;i++)
{
cout<<char(a[i]+1-i);
}
return 0;
}
再运行结果得到
解出flag:Hacker_world!