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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐