单独写一篇解CrackRTF的文章,记录一下修改堆栈的流程和花指令。
Maze
推荐文章:
IDA出现"sp-analysis failed"和F5(反编译)失败 - 灰信网(软件开发博客聚合)
[推荐]IDA sp-analysis failed 不能F5的 解决方案之(二)-软件逆向-看雪-安全社区|安全招聘|kanxue.com
CTF逆向基础----花指令总结_ctf re 花指令-CSDN博客
先放入查壳软件,有upx壳。
因为文件名中有空格,去壳程序无法识别
修改文件名后成功去壳
去壳后再次放入查壳软件,是32位的,打开ida。
找到关键字符串却无法查找哪个函数使用
在函数名中找到start函数,其中发现main函数
一、main中的红色地址
双击main函数,发现地址是红色的,也无法按空格转换到图形视图,更不能F5反编译。查阅资料后得知,IDA对于未识别出的函数都显示地址为红色,如果创建框图的区域ida不知道界限,或者有不认识的指令,就没办法显示为图形视图。
所以需要在函数头点击右键-->Create Function(快捷键P),让IDA能够识别这个函数。
出现错误提示,所以我们选中任意的一部分IDA分析不出来的代码按P来创建函数
创建函数后能够F5反汇编
二、花指令与堆栈错误
还没完,提示这个函数’endp ; sp-analysis failed’。而且发现代码中存在jumpout(xxxx)的形式,这是一种不被执行的花指令。
点击Options-->General-->选中Stack pointer,可以查看代码的堆栈指针
在修改堆栈之前,要先把花指令的代码去掉,花指令为了干扰反汇编,增加静态分析的难度。
可以阅读一下这两篇文章CTF逆向基础----花指令总结_ctf re 花指令-CSDN博客
在loc_40102E函数的开始,call near ptr 0EC85D78Bh跳转到一个地址处,很明显这是一个错误的地址。jnz short near ptr loc_40102E+1也是无用的代码。所以可以用nop指令对其进行填充,点击这行代码-->右键-->NOP(快捷键Ctrl+N)
但是不能全部nop,因为这句话后面可能有关键代码。按d转换为数据后把call的硬编码(0E8h)nop掉,这是常见的一种花指令。
发现后面这堆数据还是没有变化
于是把顺序反过来,先把无关的花指令去掉,再用P创建函数,成功得到正确的函数。
三、正确函数
分析函数,输入长度为14,wsad分别代表上下左右,n5=5并且n6=-4时得到flag
可以看出这是一个迷宫,初始位置在(7,0),迷宫总共70位,所以猜测是7*10的迷宫。
写脚本把迷宫画出来
maze=[0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2B, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x20, 0x20, 0x20, 0x2A, 0x2A,
0x2A, 0x2A, 0x20, 0x20, 0x20, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x2A, 0x2A, 0x20, 0x2A, 0x2A, 0x46, 0x2A, 0x2A, 0x2A, 0x2A,
0x2A, 0x2A, 0x20, 0x20, 0x20, 0x20, 0x2A, 0x2A, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A]
for i in range(len(maze)):
if(i%10==9):
print(chr(maze[i]))
else:
print(chr(maze[i]),end="")
从+开始走,迷宫的走法是下下左左左下左左下下右右右上,n5=7-5+3=5,n6=0-5+1=-4,符合判断条件,得到flag{ssaaasaassdddw}
四、总结
一开始只认为是创建函数和堆栈不平衡的问题,没有想到花指令,还是做的题不够多,没有了解到各种花样。查阅了大量资料后,学习到了基本的花指令和如何去花,下次包能认出来的。