[HDCTF2019]Maze
·
32位exe,有UPX壳

udx -d 去壳
还有花指令- -

指针指飞了,先看看字符

嗯?好像是迷宫,跟踪到 sub_401ECD

盲猜10个一组,得到迷宫
*******+**
******* **
**** **
** *****
** **F****
** ****
**********
按wsad的走法,出迷宫唯一路径 ssaaasaassdddw

拿到flag
回到代码段,莫名其妙的有一个jnz,跳转的位置也奇奇怪怪的,nop掉
这里的 E8 代表 call ,而后面一串明显不是函数地址,这里 58 代表 pop eax
前面 00401027 位置有个 push eax,所以这里要保留 58 ,我们把前面三个立即值nop掉

变成这个样子

然后从main函数起始位置选中到红色结束位置 00401000 -> 004010FD 按p建立函数

然后就可以反编译了
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp+0h] [ebp-24h]
int v5; // [esp+0h] [ebp-24h]
int i; // [esp+10h] [ebp-14h]
char v7[16]; // [esp+14h] [ebp-10h] BYREF
sub_401140((int)aGoThroughTheMa, v4);
scanf("%14s", v7);
for ( i = 0; i <= 13; ++i )
{
switch ( v7[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((int)aCongratulation, v5);
sub_401140((int)aHereIsTheFlagF, (int)v7);
}
else
{
sub_401140((int)aTryAgain, v5);
}
return 0;
}
这样就比较好看 wsad 移动了,直接是判断横向和竖向走了几步(相当于坐标)
最终的输入就是flag
更多推荐


所有评论(0)