首先jnz跳到下一条指令,相当于没跳转,先nop掉(选中前面的地址,然后Edit-Patch program-Assemble,输入no)
下面call了一个错误的地址。先按d转化为数据(不能直接全nop掉,因为里面可能有有用的数据)
然后逐个nop,Edit-Patch program-Change Byte,修改为0x90(先nop第一个,再nop第二个这样),详见链接。
然后选中该部分代码按c,发现没有错误了。
选中main函数所有关键代码,按p封装为函数,即可Tab转为伪代码。
int __cdecl main(int argc, const char **argv, const char **envp) { int i; // [esp+10h] [ebp-14h] char v5[16]; // [esp+14h] [ebp-10h] BYREF sub_401140(aGoThroughTheMa); scanf("%14s", v5); for ( i = 0; i <= 13; ++i ) { switch ( v5[i] ) { case 'a': --*(_DWORD *)asc_408078; break; case 'd': ++*(_DWORD *)asc_408078; break; case 's': --dword_40807C; break; case 'w': ++dword_40807C; break; default: continue; } } if ( *(_DWORD *)asc_408078 == 5 && dword_40807C == -4 ) { sub_401140(aCongratulation); sub_401140(aHereIsTheFlagF); } else { sub_401140(aTryAgain); } return 0; }
分析函数查找字符串。
结合题目名称为迷宫题,70个字符,猜测为7x10。
*******+** *******s** ****aaas** **aas***** **s**F**** **sddd**** **********
flag{ssaaasaassdddw}