少欲则心静,心静则事简。
——人民日报
1.查壳
是一个加了upx壳的32位EXE文件
2.使用Kali Linux脱壳
maze题目脱壳
3.去除脏字节
没有找到主函数,发现这段汇编代码标红了,IDA分析崩溃,这是掺杂了花指令
这里jnz,不论判断成立不成立,都会执行到同样的位置
该地址标红了,说明本来不存在这样的地址
call一个不存在的地址很不科学,说明call是被错误识别了的
我们将call指令按下快捷键U修改为二进制,将脏字之后的按下快捷键C重新分析为代码
然后全选红色地址,按下快捷键P识别为函数,得到了main函数
上次过程详细操作可以查看视频:
maze去除脏字节
4.静态分析
经过上述过程我们得到了main函数
根据题目Maze含义这应该是一个迷宫题目
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // ecx
int v4; // ST04_4
signed int i; // [esp+10h] [ebp-14h]
char v7[16]; // [esp+14h] [ebp-10h]
sub_401140(aGoThroughTheMa);
v4 = scanf(a14s, v7);
if ( (v3 ^ v4) == v3 )
JUMPOUT(unk_40102E);
for ( i = 0; i <= 13; ++i )
{
switch ( v7[i] )
{
case 'a':
--dword_408078;
break;
case 'b':
case 'c':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 't':
case 'u':
case 'v':
continue;
case 'd':
++dword_408078;
break;
case 's':
--dword_40807C;
break;
case 'w':
++dword_40807C;
break;
}
}
if ( dword_408078 != 5 || dword_40807C != -4 )
{
sub_401140(aTryAgain);
}
else
{
sub_401140(aCongratulation);
sub_401140(aHereIsTheFlagF);
}
return 0;
}
此处应该是asdw进行上下左右移动
我们点击dword_408078跟进发现值为7,说明迷宫的长或宽有可能是7
Shift+F12打开string窗口找下迷宫图案
maze="*******+********* ****** **** ******* **F****** **************"
print(len(maze))
迷宫字符串长度为70
可以猜到是7*10的迷宫
排列一下
*******+**
*******0**
****0000**
**000*****
**0**F****
**0000****
**********
得到flag{ssaaasaassdddw}