狄人3 发表于 2022-6-11 20:57

Bugku Tworld迷宫 WP(踩坑记录)

本帖最后由 狄人3 于 2022-6-23 19:01 编辑



下载下来的附件是个exe,先走一波传统查一下壳

发现是典中典UPX,而且竟然奇迹般的没有去除标志,那就直接upx -d一波



很好,但也没那么好,因为这个时候第一个坑就来了。。。。


当你打开程序试试的时候




当时就人傻了,这官方脱壳版还能炸?


这里先说说我的踩坑记录,直接手脱。。。(等会有正常方法)


脱壳当然要先拿xp

好吧,这都不行。。。。{:301_1008:}

那就拿真机脱一下
拿出x32dbg



x32dbg载入,esp上下硬断然后跑两步就能到oep,然后拿scylla dump修复一下


打开来之后应该是这样的


这个iat里有一个是无效的,右击把它删掉
然后fix dump

打开,还是炸。。。




好吧,连踩两坑。。。{:301_999:}


下面说说转机,多次打开,你会发现这个错误的指令内存是不一样的。。。
但是报错的地址是一样的
所以就思考是不是由于绝对地址被aslr影响导致错了呢
每次打开都是基址不同的,就是ASLR了


在去除ALSR后终于

太感动了。。。
好吧,二话不说扔IDA,根据题目提示是迷宫

先要进到主菜单,第一层是个简单的异或,扬了就好
enc1=
enc2=
passwd=""
for i in range(0,len(enc1)):
    passwd=passwd + chr(enc1^ enc2)
print(passwd)

二层菜单,选择1会从自身资源里加载吐出一个flag.doc
但是打开需要密码

(我相信会有人跟我一样不去逆就去整hashcat爆破的。。。。)
好吧,并不行,那么看一下2选项的迷宫


void __noreturn maze()
{
char Instruc; // cl
int v1; // ebx
int posX; // edx
char *v3; // edi
int posY; // esi
int v5; // eax
char v6; // al
unsigned int v7; // eax
char v8; //
char v9; //
__int128 v10; //
char ArgList; // BYREF
char Arglist; // BYREF

ipsi_printf("Where am I?\n", v8);
ipsi_printf_0("%s", (char)Arglist);
Instruc = Arglist;
v1 = 0;
posX = 1;
if ( Arglist )
{
    v3 = Arglist;
    posY = 12;
    do
    {
      switch ( Instruc )
      {
      case 'w':
          posY -= 12;
          break;
      case 'a':
          --posX;
          break;
      case 's':
          posY += 12;
          break;
      case 'd':
          ++posX;
          break;
      default:
          goto SUCCESS;
      }
      v5 = dword_403300;
      if ( v5 != 0x2E )
      {
      if ( v5 != 0x64 )
          break;
      v1 = 1;
      }
      v6 = *++v3;
      Instruc = v6;
    }
    while ( v6 );
SUCCESS:
    if ( v1 )
    {
      v7 = 0;
      v10 = xmmword_403480;
      v10 = xmmword_403470;
      v10 = xmmword_403450;
      v10 = xmmword_403460;
      do
      {
      ArgList = Arglist ^ LOBYTE(v10);
      ArgList = Arglist ^ BYTE4(v10);
      ArgList = Arglist ^ BYTE8(v10);
      ArgList = Arglist ^ BYTE12(v10);
      v7 += 4;
      }
      while ( v7 < 16 );
      if ( v7 < 100 )
      {
      ArgList = 0;
      ipsi_printf(yourpassis, (char)ArgList); // Success
      exit(0);
      }
      __report_rangecheckfailure();
    }
}
ipsi_printf("I'm lost.", v9);
exit(0);
}


是一个靠wasd来走的迷宫
因为y坐标是在上下的时候减去12的,所以不难看出一行有12格,且迷宫数据 dword_403300


提取出来,格式化为12列的

差不多这个样子,看判断逻辑
不等于0x2E时,会和0x64比较,如果对了那就退出循环


那么0x64就是终点了,将图用正则替换一下,就很显然了

sssddwwwddddddssssaaaa
手动走一下就结束了



果然爆不出。。。这么复杂{:301_1008:}

再输入word就好啦


总结:前面脱壳这个确实让我挺懵逼的,不过总体来说比较简单

(还是我太菜了

题目文件:
内有原题和dump修复的文件

woflant 发表于 2022-6-13 15:26

分析记录很详细,感谢楼主分享。楼主能提供练手程序吗?

狄人3 发表于 2022-6-13 15:36

woflant 发表于 2022-6-13 15:26
分析记录很详细,感谢楼主分享。楼主能提供练手程序吗?

题目来自bugku

Hmily 发表于 2022-6-23 17:31

建议把文件一并上传,方便大家学习交流。

狄人3 发表于 2022-6-23 19:01

Hmily 发表于 2022-6-23 17:31
建议把文件一并上传,方便大家学习交流。

好的,已经编辑

baicha1 发表于 2022-8-8 07:40

太强了老哥
页: [1]
查看完整版本: Bugku Tworld迷宫 WP(踩坑记录)