欢迎大家参观我的个人博客,大家一起学习交流
http://www.chenjingjiu.cn
解题链接: http://ctf5.shiyanbar.com/misc/NF/NF.rar
题目中给了两个提示,是windows和winrar,如果做到过类似的题,就会想到这题可能是NTFS交换数据隐写。
NTFS交换数据流(alternate data streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流寄宿在主文件流中。它使用资源派生来维持与文件相关的信息,虽然我们无法看到数据流文件,但是它却是真实存在于我们的系统中的。创建一个数据交换流文件的方法很简单,命令为"宿主文件:准备与宿主文件关联的数据流文件"。具体使用方法看这里。
回到题目中,首先用winrar解压NF.zip,只有一张照片,照片中人物是美国第三任总统托马斯·杰斐逊,他发明了杰斐逊转轮加密器,说明这道题目很可能跟这种加密方式有关。
用lads检测当前目录下的交换数据流,streams可以清除相关数据流,不过这次我们用不到。
![v2-1a3b0a3d594c772dfb1c84f3a672f955_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/72b826e6b667403a9f4125e7c278aa5f.jpeg)
发现有两个ADS,第一个是531字节,第二个是0字节,所以相关数据应该在第一个ADS中。
用winhex打开ADS流,winhex.exe .\20140328144416-985375150.jpg:flag
![v2-9c9d4e4aa998c23600b6e2ec4fb9c9f5_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/e4de479c666610f5298da3ee4319dd94.jpeg)
另存为flag.txt
![v2-dd9cd2afad716b7883d8389b15fc73a7_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/b9b21c726dbd75e2a73b0a8cae9231d2.jpeg)
打开看看
![v2-226f155181b56cad68c1bedc8d5c9fd8_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/cfb92652c0f5a653aaed015f69c19211.jpeg)
根据杰裴逊转轮加密器原理,最上面的14行是为了传输信息的,每一行都是26个字母。
传送信息时,通过转动转轮让其中的一列变成要传达的信息,然后抄写其他的25列中的任意一列作为密文,再打乱转轮。发送方同时将密文和密码器传递给接收方。
接收消息时,通过转动转轮让其中的一列变成密文,然后依次查看其余25列是否有想要得到的信息即可。
在本题中,多了一个密钥位,这个密钥可以理解成为密码器行的顺序,就是说将密码器转动为相应的密文后,按这个密钥的顺序读取指定行,就是先读第一行,然后第二行,然后第五行。。。这样来还原所要传递的信息。
根据如上分析,我们可以写出如下python代码对其进行解码
#存储密码器
jwc=['ZWAXJGDLUBVIQHKYPNTCRMOSFE',
'KPBELNACZDTRXMJQOYHGVSFUWI',
'BDMAIZVRNSJUWFHTEQGYXPLOCK',
'RPLNDVHGFCUKTEBSXQYIZMJWAO',
'IHFRLABEUOTSGJVDKCPMNZQWXY',
'AMKGHIWPNYCJBFZDRUSLOQXVET',
'GWTHSPYBXIZULVKMRAFDCEONJQ',
'NOZUTWDCVRJLXKISEFAPMYGHBQ',
'QWATDSRFHENYVUBMCOIKZGJXPL',
'WABMCXPLTDSRJQZGOIKFHENYVU',
'XPLTDAOIKFZGHENYSRUBMCQWVJ',
'TDSWAYXPLVUBOIKZGJRFHENMCQ',
'BMCSRFHLTDENQWAOXPYVUIKZGJ',
'XPHKZGJTDSENYVUBMLAOIRFCQW']
#存储密钥
c_k = [1,2,5,7,9,11,14,3,4,6,8,10,12,13]
#存储密文
c_t = 'BQKUTPVDKYUQVU'
#将密码器与密钥对应
c_list = [jwc[x-1] for x in c_k]
#转动密码器以还原密文
for i in range(len(c_t)):
index = c_list[i].find(c_t[i])
c_list[i] = c_list[i][index:]+c_list[i][:index]
#循环输出各列的信息,寻找符合的一项即可
for i in range(26):
row = []
for j in range(14):
row.append(c_list[j][i])
print "%dth row passwd is:%s"%(i,''.join(row))
运行代码即可得到该题的flag
![v2-1f6866ff507b68234cf2780f2f3cc4f5_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/9684b35f29920a4a2274c7b80100f138.jpeg)