本帖最后由 狄人3 于 2022-6-23 19:01 编辑
下载下来的附件是个exe,先走一波传统查一下壳
发现是典中典UPX,而且竟然奇迹般的没有去除标志,那就直接upx -d一波
很好,但也没那么好,因为这个时候第一个坑就来了。。。。
当你打开程序试试的时候
当时就人傻了,这官方脱壳版还能炸?
这里先说说我的踩坑记录,直接手脱。。。(等会有正常方法)
脱壳当然要先拿xp
好吧,这都不行。。。。
那就拿真机脱一下
拿出x32dbg
x32dbg载入,esp上下硬断然后跑两步就能到oep,然后拿scylla dump修复一下
打开来之后应该是这样的
这个iat里有一个是无效的,右击把它删掉
然后fix dump
打开,还是炸。。。
好吧,连踩两坑。。。
下面说说转机,多次打开,你会发现这个错误的指令内存是不一样的。。。
但是报错的地址是一样的
所以就思考是不是由于绝对地址被aslr影响导致错了呢
每次打开都是基址不同的,就是ASLR了
在去除ALSR后终于
太感动了。。。
好吧,二话不说扔IDA,根据题目提示是迷宫
先要进到主菜单,第一层是个简单的异或,扬了就好
[Python] 纯文本查看 复制代码 enc1=[0xD0,0xCF,0x11,0xE0,0xA1,0xB1]
enc2=[0xA3,0xA1,0x70,0xA6,0xF3,0xD7]
passwd=""
for i in range(0,len(enc1)):
passwd=passwd + chr(enc1[i]^ enc2[i])
print(passwd)
二层菜单,选择1会从自身资源里加载吐出一个flag.doc
但是打开需要密码
(我相信会有人跟我一样不去逆就去整hashcat爆破的。。。。)
好吧,并不行,那么看一下2选项的迷宫
[C] 纯文本查看 复制代码 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; // [esp+0h] [ebp-118h]
char v9; // [esp+0h] [ebp-118h]
__int128 v10[4]; // [esp+Ch] [ebp-10Ch]
char ArgList[100]; // [esp+4Ch] [ebp-CCh] BYREF
char Arglist[100]; // [esp+B0h] [ebp-68h] BYREF
ipsi_printf("Where am I?\n", v8);
ipsi_printf_0("%s", (char)Arglist);
Instruc = Arglist[0];
v1 = 0;
posX = 1;
if ( Arglist[0] )
{
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[posY + posX];
if ( v5 != 0x2E )
{
if ( v5 != 0x64 )
break;
v1 = 1;
}
v6 = *++v3;
Instruc = v6;
}
while ( v6 );
SUCCESS:
if ( v1 )
{
v7 = 0;
v10[0] = xmmword_403480;
v10[1] = xmmword_403470;
v10[2] = xmmword_403450;
v10[3] = xmmword_403460;
do
{
ArgList[v7] = Arglist[v7] ^ LOBYTE(v10[v7 / 4]);
ArgList[v7 + 1] = Arglist[v7 + 1] ^ BYTE4(v10[v7 / 4]);
ArgList[v7 + 2] = Arglist[v7 + 2] ^ BYTE8(v10[v7 / 4]);
ArgList[v7 + 3] = Arglist[v7 + 3] ^ BYTE12(v10[v7 / 4]);
v7 += 4;
}
while ( v7 < 16 );
if ( v7 < 100 )
{
ArgList[v7] = 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
手动走一下就结束了
果然爆不出。。。这么复杂
再输入word就好啦
总结:前面脱壳这个确实让我挺懵逼的,不过总体来说比较简单
(还是我太菜了
题目文件:
tworld.rar
(27.51 KB, 下载次数: 1)
内有原题和dump修复的文件
|