系统 : Linux kali 4.15.0-kali2-amd64 \ win10 64bit
程序 : hide
要求 : 输入口令
使用工具 :ida
使用file
命令拿信息:
没什么特殊的,接下来使用strings
命令拿信息:
发现upx字样,所以这里应该是加了upx壳保护。
使用upx
命令脱壳:
发现没有办法自动脱壳,所以这里只好采用手动脱壳的方式。具体做法是让程序先运行,然后等到数据自动解压/解密出来后,再dump内存组成elf文件进行分析:
将hide_dump
载入ida,按下Shift
+F12
查看字符串列表并搜索flag
:
双击跟踪第二个字符串:
对敏感字符串aYouAreRight
,查看其交叉参考:
先进入第一个函数看看:
进入sub_4009AE
函数看看:
所以这就是那个误导人的分支啰?pass掉。
进入第二个地址,发现ida没有将其识别称为一个函数,这里,我们往上搜索,发现0x4C8EF4
这个位置不错,将其设定为函数头。光标定位到0x4C8EF4
,然后右击Create Function
,sub_4C8EF4
函数就出现了:
由伪代码可知,字符串格式为qwb{x*16}
,内容经过一系列的加密和异或,最终与str_y_4C8CB0对比,一致则成功。
首先进入sub_4C8CC0
函数:
搜索算法常数key1、2、3、4没有发现有价值的线索,搜索0x676E696C
也是如此。
出于对十六进制的敏感,试了一下算法常数的字符串形式是什么样子:
百度搜索ctf gnil
,发现此人,也就是本题作者,应该是FlappyPig
战队的成员。
根据结构可以知道,这是tea算法,但细节处也有很多不同。不妨搜索>> 11) & 3 tea加密
这样由知名加密算法+特殊计算的关键词,很简单知道了这里利用的是xtea算法。
我们对比标准的xtea算法和程序中的算法可知有三点不同
关于第三点,我们在ida中双击v1查看函数栈视图:
v0 占了四个字节,v1占了八个字节,即 sum == HIDWORD(v1)
我们将程序中的xtea算法和异或算法还原出来,按照相反的顺序对给出的密文进行操作,就可以得到flag了。
按照以上推理,编写C++程序如下:
运行结果:
考虑到数据在内存中是以小尾方式存放的,我们使用python脚本转换一下:
运行结果如下:
使用得出的明文加上flag格式,作为给hide程序的输入,并且以Ctrl
+D
结束输入:
➜ playground file ./hide
./hide: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-5-16 13:35
被顾言庭编辑
,原因: