1.解题过程:
由于是迷宫题,分为两个部分:
①迷宫图
②迷宫规则
首先查找字符串发现一串符号,推测是迷宫图,但不知道怎么排列
接着f5反编译得到代码,应该就是迷宫的规则,所以开始分析代码(下面三张图的注释)
接着我们要分析四个 if 语句中的四个函数
注意:二维数组在存储时是按行排列的,四个函数都是bool返回False或者True
1)函数 sub_400650
作用:v9的下一个字节 -1 对应 将 v9 对应的位置向左移一个位置,并将此位置v5赋予对应的符号
2)函数 sub_400660
作用:v9的下一个字节 +1 对应 将 v9 对应的位置向右移一个位置,并将此位置v5赋予对应的符号
3)函数 sub_400670
作用:v9 -1 对应 将 v9 对应的位置向上移一个位置,并将此位置v5赋予对应的符号
4)函数 sub_400680
作用:v9 +1 对应 将 v9 对应的位置向下移一个位置,并将此位置v5赋予对应的符号
5)字符串 asc_601060
存放的迷宫
6)接下来看到这一段,对应调用函数,实参传形参
传入函数 sub_400690
对应我们可以知道 a1 就是迷宫字符串,而 a2 对应的是 v9 的下一个位置(详细请看知识点)
a3 对应的是 v9
通过四个函数可以看到上下左右移动的范围都是 0-8 ,所以这个迷宫为 8x8 的迷宫
在 VScode 下可以进行对齐 ,使用 0 替代空格填充,方便查看
注意:LL为 long long 类型的后缀
最后按照上 ’.‘ 下 ’0‘ 左 ’O‘ 右’o‘ 走迷宫
下下右右下下左下下下右右右右上上左左
注意最后一个还是左,因为最后一步为 #,而程序最后判断是否为 #
所以flag就是
nctf{o0oo00O000oooo…OO}
2.知识点:
(1).pyc文件是二进制文件,而.py文件是python语言直接产生的文件,就像c语言对应的.c文件,c++对应的.cpp文件,.pyc文件是由原来的python编译后产生的,所以可以使用反编译进行处理得到.py源文件
(2)其中涉及的 c 库函数:
①strlen
②strncmp()
③chr(97) 返回值 a
可以返回对应整数的ASCII码值
(3)涉及到的IDA中的宏定义:(下面的 DWORD 代表 unsigned long)
①#define HIDWORD(x)
对应 (*((_DWORD*)&(x)+1))
②#define SHIDWORD(x)
对应 (*((int32*)&(x)+1))
③#define LOBYTE(x) (*((_BYTE*)&(x)))
对应 low byte 低位
注意:指针 + 整型数 结构:
如:char *p="1234567890";
则 p+3 指向 4
char *p="abcdefghijklmn";
则 p+3 指向 d
IDA常见宏定义_bluestar628的博客-CSDN博客_ida宏定义
(4)两个静态内存分配
①.bss段:指存放程序中未初始化的全局变量的一块内存区域
②.date段:指存放程序中已初始化的全局变量的一块内存区域
(5)本题IDA中的涉及的假名字:
sub_ 子函数
asc_ ASCII字符串
IDA调试技巧(妥妥的干货分享) - 简书 (jianshu.com)