历时一个月之久,hackme的一道有点难度的逆向题,学习了两个新工具的搭建与使用。
拿到题之后,发现汇编指令除了call之外,基本都是mov。惊呆了!这才想起题目描述中的“mov是图灵完备的”是什么意思。
谷歌了一下,这是一种名为movfuscator的混淆。
通过别人的类似题目的题解,尝试了一下demovfuscator的反混淆。
demovfuscator的环境搭建极其困难,至少对我来说是这样的。我浪费了好多天时间。最后制作了一个docker镜像,喜大普奔!
有关demovfuscator的笔记请参考我之前的博文:demovfuscator docker镜像
然鹅反混淆后的代码依旧难以看懂。
又谷歌了一下,得知了qira这个工具。
qira是一个动态调试器,能够记录每一个状态。
这玩意也不好搭建,项目本身就有很多bug,比如因为flask(qira的web界面的UI是依赖于python的flask)的版本更新而导致的qira初始化失败,比如UI的左侧显示问题,等等。
好不容易做了个镜像。详情请戳我的docker hub。
qira的中文资料很少,好不容易找到一个中文的命令介绍,这里摘录一下,以防丢失。
一个神奇的调试器,由geohot编写,安装:
1 | cd ~/ |
注意,他需要Flask-SocketIO==2.9.1
,将requirements.txt文件对应项改掉就行啦~
用法:
1 | usage: qira.py [-h] [-s] [-t] [--gate-trace ADDRESS] [--flush-cache] [--pin] |
看着一脸懵逼,最简单的就是./qira /bin/ls
啦,此时它会监听3002,使用浏览器打开即可(若打开为空白,结束命令再启动,多试几次就好啦):
该区域为垂直时间线,从上至下记录着整个程序从开始追踪到当前执行到的位置(若程序已经结束则指向结束位置),它本来是绿色,颜色越深代表函数调用深度越深,当数据区(下面会提,即7区域)的光标指向某个地址时,该区域也会有不同的颜色变化,亮黄色代表该地址在那个时候被读过,暗黄色代表该在那个时候被写过,而代码区(即4区域)的光标指向的地址在这里以蓝色表示。通过鼠标左键拖动选中一块时间线可以缩小查看的范围,使用
z
键可以恢复该区大小,另外右键双击该区域能隐藏当前进程的时间线。该区域为内存属性区域。
该区域有四个框:
- 第一个代表指令序号,qira会为按执行顺序为每一条执行到的指令编号,数字以蓝色标记,可以在这个框里输入数据快速跳转到相应序号处。
- 第二个代表子线程/进程编号,数字以灰色标记,通过它可以可以切换线程编号,当然左右方向键也有此功能。
- 第三个代表指令地址,数字以红色标记,可以在此键入地址快速跳转,当然
g
键也可以快速跳转。 - 第四个代表数据地址,数字以黄色标记,可以在此键入地址快速跳转。
该区域为指令区,第一列为指令序号,前面有提,调用者与被调用者左右不对齐,可以看出明显的层次关系,第二列为指令地址,第三列为反汇编语句,可以在这个框里使用很多按键:
1 | j -- 跳转到下次对当前指令调用的地址 |
此区域为通用寄存器区域,不同的寄存器用了不同的颜色标记,里面的数据属于指令地址的用红色标记,属于数据地址的用黄色标记,其他事黑色,红色高亮的寄存器是上条指令改变的寄存器,最下行是当前指令的读写操作,暗黄色代表读,亮黄色为将右侧数据写入左侧地址。
此区域为当前所进行的系统调用。
此区域为数据dump。
另外它也支持与ida连接,由于它自己编译的插件是plw的,我这里就用ida6.8来配套使用,将./ida/bin
下的windows下的两个插件放入ida的插件目录,启动ida,启动插件:
接着ida和qira就同步了,另外F5的伪代码也能定位,美滋滋:
需要注意:ida.js里面ida地址写的是localhost,若浏览器不在那台电脑上将会失败,改一下即可
以上内容摘自调试器与反编译工具
然后经过极其漫长的分析,猜测算法是输入字符串,按照程序中自带的字符重新计算偏移量,找到对应字符。
1 | strings='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{}_/*-+' |
其实之前看到过一个大佬的题解,他说他无意间发现本题可以爆破flag,因为输入不完整的flag时,程序也会输出cerrent。这里摘录他的爆破脚本。
我感觉这个漏洞是出题人故意留的。
1 | import subprocess |