[HDCTF2019]Maze
信息收集
查壳,发现upx壳,用脱壳机退一下
拖入ida,发现有花指令,无法反编译

花指令
这是一个典型的花指令,仔细分析一下这四行代码
.text:0040102C jnz short near ptr loc_40102E+1
.text:0040102E
.text:0040102E loc_40102E: ; CODE XREF: .text:0040102C↑j
.text:0040102E call near ptr 0EC85D78Bh
第一行其实没什么作用就是跳到第四行(第二三行地址是相同的)
第四行就是调用一个近指针指向的地址,但这个地址是无效地址
这就是导致ida无法反编译的主要原因
处理方法
先将第一行NOP(无效)一下

我一开始的处理方法是将第四行也NOP了,但是经过查询,发现call后面会有有效代码,全部NOP还会导致出错
所以先d键看一下call这个指令的机器码

db 0E8h是添加花指令的表示,ida会将后面的数据自动看成地址,只要往这里加入无效数据,就可以产生花指令
所以一般处理方式是先将db 0E8h进行NOP(如果不行的话再将后面也NOP,一般是一个一个尝试)

然后在 db 90h(NOP指令)的下一行按c键,让后面再成为代码,这一步比较特殊,因为我在看别的师傅的博客时发现有的ida后面会自动成为代码,但我的就不行,这一步我看了很久
最后选中所有关键地址(红色的地址),按p键将他们重新声明为函数,这里我的理解是,经过这么多操作ida无法将它们视为正常的代码,所以要再重新申明一下
关于花指令的构造
永恒跳转
最简单的jmp指令
jmp LABEL1
db junk_code;
LABEL1:
这种jmp单次跳转只能骗过线性扫描算法,会被IDA识别(递归下降)。
多层跳转
__asm {
jmp LABEL1;
_emit 68h;
LABEL1:
jmp LABEL2;
_emit 0CDh;
_emit 20h;
LABEL2:
jmp LABEL3;
_emit 0E8h;
LABEL3:
}
和单次跳转一样,这种也会被IDA识别。
为了骗过IDA,我们将上面的花指令改写一下,
__asm {
_emit 0xE8
_emit 0xFF
//_emit 立即数:代表在这个位置插入一个数据,这里插入的是0xe8
}
查看反汇编后的结果

代
代码分析
此时可以看到出现了"a"“s”“d”“w"四个熟悉的方向键,可以推断之后的flag就是以这四个字符组成的字符串。
同时可以分析得到,asc函数控制左右,dword函数控制上下。
看到下方的if条件,如果走到坐标为(5,-4)处输出Congratulation,说明迷宫的出口(5,-4)。那么我们按shift+f12下拉可以看到我们需要的迷宫字符串,一共七十个元素,要折叠成矩阵要么是7×10,要么是10×7.再看到下面的asc函数初始值为7,dword函数初始值是0,可以判断迷宫的入口位置在(7,0),那么矩阵应该为七行十列。

将迷宫字符串组成目标矩阵,”+"为入口,“F"为出口开始走迷宫,记下字符串"ssaaasaassdddw”,包上flag{}即可得到flag。
攻防世界:easy_Maze
easy_Maze
IDA分析得知main里有三个主要函数,step0和step1用来生成一张7X7的地图,step2读取键位,并且判断当前地图是否为1。
生成地图的函数算法过于复杂,但可以通过动态调试看数据来直接看到结果。
在step2下断,程序运行到这里后进call,找到a1的地址,在数据窗口找到,把49个字节复制出来,转换成地图即可。
UNCTF{ssddwdwdddssaasasaaassddddwdds}
1万+

被折叠的 条评论
为什么被折叠?



