BUUCTF [HDCTF2019]Maze
2022年11月17日 初步了解花指令
认真de题解
下载题目之后,拖到ida(32位)后,发现左侧编码代码很少,可能是没有脱壳!
再拖到查壳软件中:
可以知道要用ida 7.7(32位),有壳。
去壳步骤如下:
1.将文件拖到upx,并从终端打开它
2.输入./upx.exe -d .\maze~~~ (Tab补全)—输入文件地址
3.结果如图:脱壳成功!
再把拖好壳的文件放入刚刚知道的IDA 7.7(32位)中:
可以看到,脱过壳的文件左侧有很多字符串,这时重点来了!我们发现中间区域有表红地方,并且按F5反编译不成功。同时关键词‘jnz’是条件跳转语句,跳到下一行,无操作,视为无用!故此处可以nop掉!
我们看到‘jnz’这一行:loc_40102E+1跳到下一行,然而这个操作并没有什么用,所以我们直接nop掉!
如何nop?
1.快捷键:control+N(apply to IDA7.7)
2.Edit–patch… --change byte(将第一个数改为‘90’)
然而下一行‘call’,可能藏着数据,我们不能直接nop掉。点击红色部分(为什么是红的?数据可能有用?),按‘D’(将代码转换为数据),可以将它转换为数据(这是D的作用吗?是的)。
ps.别人的讲解
现在我们再尝试反编译这段编码,发现按F5仍然不能反编译。我们发现,中间左侧的代码还是红色的(这代表什么?这些函数未被声明)。括住红色部分按‘P’(p是干嘛的?声明函数:create function)将红色部分变成黑色的,又出现了新的问题:
出现了‘_main endp ; sp-analysis failed’,这说明我们没有讲它们编译为数据,将该部分括住,按‘C’(c是干啥用的?将数据转换为代码),编译好的数据,如图所示:
我们再次将左侧侧标红处按‘p’,变为黑色后,再F5发现可以编译,如图所示:
仍然有爆红的地方,因此,我们返回上一级,说明我们仍然有花指令没有nop干净,此时我们需要一个个实验,直到‘0040102F’行,发现反编译正确!
下面就是正常解迷宫题环节啦
问答环节
Q1:如何判断花指令?
A1:使用了花指令的地方,一般都会出现这样的现象:一个跳转指令,跳转到了某条语句的中间位置,而不是这条语句的開始位置。每当出现这样的情况时,我们就能够断定,这里出现了花指令。
Q2:如何破解花指令?
A2:在那个跳转到的目的地址之前将中间的代码所有nop掉!
预告一下
总结一下二叉树噜