下载之后查看是UPX壳的,先脱壳。
拖入IDA,查看伪C代码。
一进来就发现了main,但是在里面会看到堆栈报错的问题,其上一条命令就是常规的动态运算反调试,40102E+1=40102F,在2F处重新生成代码即可,2E处的指令NOP掉。
jnz short near ptr loc_40102E+1跳转到下一行代码,不跳转也是下一行,花指令阻碍ida反汇编
然后选中main头,按P键更新代码,发现main函数出来了。
int __cdecl main(int argc, const char **argv, const char **envp)
{
signed int i; // [sp+10h] [bp-14h]@1
char v5[16]; // [sp+14h] [bp-10h]@1
sub_401140(aGoThroughTheMa);
scanf(a14s, v5);
for ( i = 0; i <= 13; ++i )
{
switch ( v5[i] )
{
case 119:
++dword_40807C;
break;
case 115:
--dword_40807C;
break;
case 97:
--dword_408078;
break;
case 100:
++dword_408078;
break;
default:
continue;
}
}
if ( dword_408078 != 5 || dword_40807C != -4 )
{
sub_401140(aTryAgain___);
}
else
{
sub_401140(aCongratulation);
sub_401140(aHereIsTheFlagF);
}
return 0;
}
dword_40807C是0,dword_408078是7。
找到迷宫字符:
*******+********* ****** **** ******* **F****** **************
猜一下10*7
*******+**
*******#**
****####**
**###*****
**#**F****
**####****
**********
所以ssaaasaassdddw,成功