Q群里看到的很有意思的解密红包,很像 CTF 的 Misc 题目。发现题目时已经是晚上十一点,而十一点半红包就会失效,最后也没解出来。后来博客站长发布了解题答案,现在写个简单的 WP 捋一下思路。
题目来源:2023 年度总结(附解谜红包) | 萤火之光 (alampy.com)
很显然涉及到了图片隐写。下载下来是 JPG 格式,拖进 Kali 发现打得开,应该不是长宽隐写。 拖进 Stegsolve 看了所有图层,再看 LSB ,没发现藏东西。猜测是图种。
直接右键 Foremost 分离文件,发现藏了个压缩包:
有密码:
拖进 WinHex 发现不是伪加密。图片和压缩包拖进 WinHex ,啥也没看出来,没藏密码。感觉没思路了,这时候我想起来这是 JPG 图片,随便右键了一下,属性里有惊喜: 备注就是密码。
解压出来两个代码文件,大致看了一下代码功能基本一致,只看一个就行。打开py文件:
代码逻辑比较简单,要求输入 key ,如果 key 与字节序列 "red-packet" 进行异或操作的结果等于 "alampy.com" ,就使用 MD5 散列算法对 key 进行处理,得到16字节的密钥。之后就是 AES 相关的东西了。其实只需要找到正确的 key 就行。总之最后会输出和 flag 有关系的东西。
当时脑子抽了没转过弯来, key 输出是乱码,不能直接 UTF-8 输出。但其实可以不输出直接在内存里跑。修改后代码如图:
得到输出:TXT: redpacket2024.alampy.com
浏览器访问 redpacket2024.alampy.com ,但是网页被重定向到了 RFC1035 规范文档页面,看来访问还得用别的路子。结合上一步提示的 TXT ,用 nslookup 命令获取该域名的 TXT 记录:
后面这一大坨38206469676974732c20313937312d30352d32335430373a31373a30335a
看着像 Hex 编码,直接解开:
一个看上去没什么的时间戳。前面的8 digits
可能提示红包口令是 8 位(支付宝口令似乎默认生成的就是 8 位数字)。
但是 UNIX 时间戳的 0 按照 [ISO 8601](https://baike.baidu.com/item/ISO 8601/3910715?fromModule=lemma_inlink) 规范为 1970-01-01T00:00:00Z ,并且 UNIX 时间戳记录的是秒数。将 1971-05-23T07:17:03Z 转换为 UNIX 时间戳,得到 43831023
,即为红包口令。
总结一下,这道题目比较考验对CS知识的综合了解,也很符合我对 Misc 的印象,就是贼喜欢绕弯子。