BinWalk是一个固件的分析工具,旨在协助研究人员对固件进行分析,提取及逆向工程用处。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。最简单的使用方法很直接,提供文件路径和文件名即可。
BinWalk常用于识别任意二进制数据块中所包含的其他类型的文件数据。
数据加密标准(DES,Data Encryption Standard)是一种对称加密算法,DES将固定长度的明文通过一系列复杂的操作变成同样长度的密文。对DES而言,块长度为64位,密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于奇偶校验,并在算法中被丢弃。因此,DES的有效密钥长度为56位,通常称DES的密钥长度为56位。
使用Python的PyCrypto库可以方便的进行DES加解密操作。
Wireshark是一个网络数据包分析软件,即通常所说的抓包软件。Wireshark可以抓取通过制定网卡的所有网络数据包,并根据数据包的格式尽可能显示出最为详细的信息,其支持各种主流的网络通信协议。Wireshark使用WinPCAP作为接口,直接与网卡进行数据交换。
使用Wireshark的过滤器tcp contains ".rar"可以快速过滤中包含有.rar字符的流量记录。
本实验选自XCTF-HCTF杭州(杭电)站选拔赛决赛,实验综合了Wireshark网络数据包流量分析、doc文档末尾附加数据识别、DES解密、PDF隐写相关的知识。
服务器:Windows XP,IP地址:随机分配
辅助工具:Binwalk、Python、Wireshark、C32Asm
(1)XCTF真题实战;
(2)了解DES加密算法,使用Python实现DES加解密操作;
(3)了解在PDF中隐藏信息的一种方法;
通信流量分析
使用Wireshark打开HEHEHE.pcap文件。对于通信流量分析类题目,常用的一个解法就是使用过滤器tcp contains ".rar"来查看数据包中是否包含有rar文件,实际操作时rar可以换成zip等其他扩展名。
现在在Wireshark的Filter编辑框中输入过滤器tcp contains “.rar”,果然发了这样的通信记录,选中第一条结果,单击右键选择“Follow TCP Stream”,可以看到数据包里存在一个rar文件,这里将其Dump出来(在窗口中选择Raw,然后点击SaveAs按钮即可),如下图所示:
对保存的Rar文件进行解压,得到两个文件,分别为:2013-2014关于评选先进班集体的通知.doc、福利.jpg。从doc文件中似乎看不到什么有用的信息,从jpg文件中可以看到一个Key,为XPA087T24433PASS。
DES解密
通过对《2013-2014关于评选先进班集体的通知.doc》文件的分析,发现doc文件末尾附加了一段数据,那这一段数据是如何发现的呢?我们可以新建一个doc文件,然后将原始doc文件中的数据复制粘贴到新建的doc文件中,保存后对比两个文件的大小发现是不一样的,所以可以猜测原始doc文件中附加了额外的数据。
经过分析,附加数据是从doc文件偏移0x16C00处开始的,通过使用C32Asm将末尾的附加数据提取出来。打开桌面的C32Asm,载入doc文件,按下Ctrl+G来到0x16C00,将0x16C00之前的数据全部删除,保存文件即可,这里将新的文件命名为data.dex。
将deDES.py与data.dex放在同一目录下,双击py脚本即可执行解密,解密结果存放与data.txt之中。
PDF文件分析
打开PDF文件,发现文件的内容和最初的doc文件内容是一致的,但是很难看出来PDF文件中隐藏了什么信息。尝试修改PDF文件的背景颜色也看不出有什么不同之处。
打开PDF文件,将其另存为txt文件,发现在页面和页脚有两串字符串,且每一页都会重复,如下图所示:
拼接这两个字符串,得到WVVkT01GcHBWVE5SYlVaNldrWTVlR1F5Vld4T1ZWVnNUbFZWYkUxcVZXeE9WVlZzVFdwU1psbFlUbXRhYkRoNVRYcE5la3BVWkVWS1ZFbDNZbTFXTkdSRFZYbE5SV3hSU2xSSmQwcFVUa0pLVkVsM1RWUkJkVTFVU1hWTlZGRjFUbFJGYkUxcVFTVXpSQSUzRCUzRA==
尝试对其进行Base64字节,得到YUdOMFppVTNRbUZ6WkY5eGQyVWxOVVVsTlVVbE1qVWxOVVVsTWpSZllYTmtabDh5TXpNekpUZEVKVEl3Ym1WNGRDVXlNRWxRSlRJd0pUTkJKVEl3TVRBdU1USXVNVFF1TlRFbE1qQSUzRA%3D%3D,注意后面有%3D,这是等于号=的URL编码方式,将其替换为=继续进行Base64解码,最后进行一次URL解码即可得到Flag。
成功拿到flag!:
hctf{asd_qwe^^%^$_asdf_2333}
成功得到flag:
hctf{asd_qwe^^%^$_asdf_2333}