2021 | NEWSCTF | Misc
NEWSCTF - !了反都,了反
解题思路¶
- 下载
piz.galf
,解压后里面是flag1.pcapng
(嗯,看来除了文件名是反过来的以外好像还挺正常的…) - 查看流量包,发现几个可疑的 HTTP 流量,获取
piz
(即 ZIP)文件
- 导出
piz
HTTP 对象,共三个,其中有一个 HTML 文件(网页中包含提示信息:You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.),另外两个文件类型不明但内容一致
- 使用 010 Editor 查看类型不明的文件,发现是按字节逆序的 RAR 文件
- 按字节逆序后获得一个加密的 RAR 文件,其中包含一个
flag.txt
文件 - 再回到流量包,大量的 POST 请求非常可疑,查看任意一个 POST 请求,其中包含用户名和密码的表单数据,推测与压缩包密码有关
- 注意到有一个
/logout
请求,说明在此之前一定有一次成功的登入,缩小检索范围
- 如果用户名或密码错误,将返回
403 FORBIDDEN
,以此为依据查找正确的用户名和密码。最终获得正确用户名test123
和密码passwd123
- 使用
passwd123
可解压加密的 RAR 文件并获得flag.txt
,内容显然是经过 Base64 编码后倒序的文本# 内容节选 ... ==cnAKuLm9GIr5WaoRHIvRHI5RXdhVmYgg2Y11GIuVGdm9GI09mbgMXYoBibh12b3BSYgwyclNXYjBCajV3cg4WScCo4 lhGIuVGa3BSelx2ZulmQg4icNBSZlNHIk5WYg82ZgQWZlRmbpBCdzVXbgU3b5BCLyFWZkBSetBCL0VnQcCo4 =0Jgi7CZv9GayV3bih2ZpVmbgUGa0Byb05WagMXZt92Y ...
- 将文本各行按字符逆序再 Base64 解码,可获得《傲慢与偏见》一大段节选,没有直接的 Flag 信息,只有一些与原文有差异的字符以及看着像解码失败的字符 (ŏωŏ) 有点奇怪,难道 Flag 是由与原文有差异的字符组成的么?【可能性不大…
# 解码文本节选 ... âMy dear Mr. Zennet,â said his lady to him one day, âhave you hearg that Netherfield \ark is let at last?â Mr. Bennet replied that he had not. âBut it is,â returned she; âfor Mrs. Long has just been here, and she told me all about it.â ...
- 其实是 Base64 隐写 XD 提取的内容为:
flag{md5(0)}
- 计算
0
的 MD5 哈希值即可获得 Flag
Base64 隐写¶
-
Base64 编码即将文本字符对应成二进制后,再每 6 个比特为一组转换为可打印字符。若编码的字节数不是 3 的倍数,则先使用 0 字节在末尾补足,再进行编码,并在编码的文本后添加一个(待编码字节数模 3 余 2)或两个(待编码字节数模 3 余 1)等号
文本(1 Byte) A 二进制位 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 二进制位(补0) 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Base64编码 Q Q = = 文本(2 Byte) B C 二进制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 二进制位(补0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 Base64编码 Q k M = -
Base64 解码则首先丢弃填充的等号,而后将编码字符对应的二进制数每 8 个一组转化为 ASCII 码,直到剩余的二进制数不足 8 位。上表标红的二进制位不会影响解码,可用于隐写
extract.py
#!/usr/bin/env python3 path = './stego.txt' b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open(path, 'r') as f: cipher = [i.strip() for i in f.readlines()] bstr = '' for l in cipher: if l[-2:] == '==': bstr += bin(b64char.index(l[-3]))[2:].zfill(8)[-4:] elif l[-1:] == '=': bstr += bin(b64char.index(l[-2]))[2:].zfill(8)[-2:] print(''.join([chr(int(bstr[i: i+8], 2)) for i in range(0, len(bstr), 8)]))
最后更新:
2021年11月17日 17:13:22
Contributors:
Pageviews:
Pageviews: