maze
__int64 __fastcall main(int a1, char **a2, char **a3)
{
__int64 v3; // rbx
int v4; // eax
char v5; // bp
char v6; // al
const char *v7; // rdi
unsigned int v9; // [rsp+0h] [rbp-28h] BYREF
int v10[9]; // [rsp+4h] [rbp-24h] BYREF
v10[0] = 0;
v9 = 0;
puts("Input flag:");
scanf("%s", &input);
if ( strlen(&input) != 24 || strncmp(&input, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 )// 长度24,前5,,nctf{后1,,}
{
wrong_:
puts("Wrong flag!");
exit(-1);
}
v3 = 5LL;
if ( strlen(&input) - 1 > 5 )
{
while ( 1 )
{
v4 = *(&input + v3);
v5 = 0;
if ( v4 > 78 ) // v4大于78一组,控制v10
{
if ( v4 == 'O' )
{
v6 = sub_400650(v10);
goto LABEL_14;
}
if ( v4 == 'o' )
{
v6 = sub_400660(v10);
goto LABEL_14;
}
}
else // v4小于78一组,控制v9
{
if ( v4 == '.' )
{
v6 = sub_400670(&v9);
goto LABEL_14;
}
if ( v4 == '0' )
{
v6 = sub_400680(&v9);
LABEL_14:
v5 = v6;
goto LABEL_15;
}
}
LABEL_15:
if ( !sub_400690(maze, v10[0], v9) )
goto wrong_;
if ( ++v3 >= strlen(&input) - 1 )
{
if ( v5 )
break;
wrong:
v7 = "Wrong flag!";
goto LABEL_21;
}
}
}
if ( maze[8 * v9 + v10[0]] != 35 ) // #出口
goto wrong;
v7 = "Congratulations!";
LABEL_21:
puts(v7);
return 0LL;
}
其中
从此函数判断v9,v10的意义
v9要乘8,推断一行有8个元素,v9变化1,乘8后上下移动一行
所以v10控制左右移动,v9控制上下移动
再进入4个if中的函数判断,知O--向左,o--向右,.--向上,0--向下
每次输入后也要在次函数判断走到‘ ’(32)或‘#’(35)都对
搞清如何移动后,脚本变一下迷宫格式,
OOXXXXXX 右下
XOOOXOOX 右右下
XXXOXOXX 下
XXOOXOXX 左下
XOOX#OOX 下 左左
XXOXXXOX 下 上
XXOOOOOX 右右右右 上
XXXXXXXX
十八次操作换成指定字符
o0oo00O000oooo..OO
加上前后nctf{}正好24个
easy_Maze
main函数
v7数组下面出现连续且类型相同的变量v8v9.....储存的内容也像是有些联系,猜测ida分析出错,数组v7的长度给小了,下面也应该是属于v7数组,改为v7[49],,,我为什么这样推测,因为‘Newbie_calculations’改过一次
查下字符串
定位到该字符串,它在(main)--->(Step_2)--->(output)中,浅看一下output
猜测这长条啥函数应该是输出,
for上面输出flag开头格式
for里面循环遍历数组-------v6存储flag内容应该是输入的方向,v8为flag位数
for下面输出flag结尾格式
到上一层output附近,可以看出如果满足条件就祝贺并output flag
错误就输出叫你再逝一次
已知目的地后从main开始分析
发现不复杂,除了赋值,主要的就是这三个函数
前两个有点像,都是从第一个参数的值按某种逻辑赋值给第三个参数
v7->v6->v5,,最后v5到step2中判断,v5很可能就是迷宫地图
前两个函数制造地图
现在来仔细查看
只是简单赋值,没有输入,没必要完全看明白,剩下的交给动态
1.ida动态
2.jdb动态
我这里用的jdb,ida没调好,,其实jdb第一次用,亏有真珠格格相助,
首先在step_2处下断点,因为此位置是step_0,step_1执行完,要向step_2中传参(v5)
在此可以在寄存器中找到参数v5
查看寄存器的值,那么那个寄存器里是v5的地址呢
看一下step_2上面的汇编
var_270就是v5,lea把v5地址传入rax,mov再把rax的值赋值给rdi
所以rdi中是v5的地址:0x7fffffffdc30
得到v5地址后可以根据地址查值
以0x7fffffffdc30为首地址,向后查49位
1000001010101010001010000010101010001010100000001
不太对,不知道为啥,等有条件了在试一下
搞出迷宫地图后,研究一下step_2,找一下移动控制键,见到数字就转字符
这个循环条件可以看出,改变v10控制上下移动,改变v9控制左右移动,‘1’是路径
上面分析过output函数,v6存储flag内容应该是输入的方向,v8为flag位数,所以移动次数要小于等于29
LABEL_14作用,提示输入非法字符
怎么进入if里面,v10==6说明向下6行,v9==6向右六列,说明终点在右下角
搞明白了,玩就完了
ssddwdwdddssaasasaaassddddwdds