Misc-一闪一闪亮晶晶
题目描述:凯撒大帝想学习一下Starry语言,你能帮帮他么吗
可知解题思路:凯撒加密+starry
- 凯撒加密为将字符串中字母向后移动n位,得到加密后的字符串,n就是密钥
- Starry语言类似ook/mindfuck,具体可以在 搞怪语言——Starry语言简介-优快云博客 有详细介绍
首先看下flag文件头尾发现是 JDBhJDBsJDBh……JDBsLjBsJDBhJDBhJD4= ,很明显的base64,但是截取前面一部分进行解码之后得到 $0l.0l$0a$0a$> ,既不能进行凯撒解密,也不是starry表示方式,那么猜测是先进行了凯撒加密。但问题又来了,现在不知道凯撒加密中密钥n是多少(也就是移了多少位),于是进行python脚本遍历破解
import base64
# 截取文件最前面一部分进行猜测,因为根据后面可知这一部分是近似的四字符反复重复
key = "JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBh"
# 遍历凯撒加密中25种的可能性
for n in range(0, 26):
str_encrypt = ""
for letter in key:
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter
# 输出每一种可能性最后的结果
print(base64.decodebytes(str_encrypt.encode()))
输出结果
b'$0a$0l$0a$0l$0a$0a$0l$0k$0a$0a/:a$0a$0a$;a$:a$0a'
b'(@\xa2(@\xad(@\xa2(@\xad(@\xa2(@\xa2(@\xad(@\xac(@\xa2(@\xa21\xaa\xa2(@\xa2(@\xa2(K\xa2(J\xa2(@\xa2'
b',P\xe3,P\xee,P\xe3,P\xee,P\xe3,P\xe3,P\xee,P\xed,P\xe3,P\xe35\xba\xe3,P\xe3,P\xe3,[\xe3,Z\xe3,P\xe3'
b'0a$0a/0a$0a/0a$0a$0a/0a.0a$0a$9\xcb$0a$0a$0l$0k$0a$'
b'4qe4qp4qe4qp4qe4qe4qp4qo4qe4qe=\xdbe4qe4qe4|e4{e4qe'
b'8\x81\xa68\x81\xb18\x81\xa68\x81\xb18\x81\xa68\x81\xa68\x81\xb18\x81\xb08\x81\xa68\x81\xa6A\xeb\xa68\x81\xa68\x81\xa68\x8c\xa68\x8b\xa68\x81\xa6'
b'<\x91\xe7<\x91\xf2<\x91\xe7<\x91\xf2<\x91\xe7<\x91\xe7<\x91\xf2<\x91\xf1<\x91\xe7<\x91\xe7E\xfb\xe7<\x91\xe7<\x91\xe7<\x9c\xe7<\x9b\xe7<\x91\xe7'
b'@\xa2(@\xa23@\xa2(@\xa23@\xa2(@\xa2(@\xa23@\xa22@\xa2(@\xa2(J\x0c(@\xa2(@\xa2(@\xa6\xa8@\xac(@\xa2('
b'D\xb2iD\xb2ZD\xb2iD\xb2ZD\xb2iD\xb2iD\xb2ZD\xb2sD\xb2iD\xb2iN\x1ciD\xb2iD\xb2iD\xb6\xe9D\xbciD\xb2i'
b'H\xc2\xaaH\xc2\x9bH\xc2\xaaH\xc2\x9bH\xc2\xaaH\xc2\xaaH\xc2\x9bH\xc2\x9aH\xc2\xaaH\xc2\xaaR,\xaaH\xc2\xaaH\xc2\xaaH\xc7*H\xcc\xaaH\xc2\xaa'
b'L\xd2\xebL\xd2\xdcL\xd2\xebL\xd2\xdcL\xd2\xebL\xd2\xebL\xd2\xdcL\xd2\xdbL\xd2\xebL\xd2\xebV<\xebL\xd2\xebL\xd2\xebL\xd7kL\xdc\xebL\xd2\xeb'
b'P\xe3,P\xe3\x1dP\xe3,P\xe3\x1dP\xe3,P\xe3,P\xe3\x1dP\xe3\x1cP\xe3,P\xe3,ZF\xacP\xe3,P\xe3,P\xe7\xacP\xe6\xacP\xe3,'
b'T\xf3mT\xf3^T\xf3mT\xf3^T\xf3mT\xf3mT\xf3^T\xf3]T\xf3mT\xf3m^V\xedT\xf3mT\xf3mT\xf7\xedT\xf6\xedT\xf3m'
b'Y\x03\xaeY\x03\x9fY\x03\xaeY\x03\x9fY\x03\xaeY\x03\xaeY\x03\x9fY\x03\x9eY\x03\xaeY\x03\xaebg.Y\x03\xaeY\x03\xaeY\x08.Y\x07.Y\x03\xae'
b']\x13\xef]\x13\xe0]\x13\xef]\x13\xe0]\x13\xef]\x13\xef]\x13\xe0]\x13\xdf]\x13\xef]\x13\xeffwo]\x13\xef]\x13\xef]\x18o]\x17o]\x13\xef'
b"a$0a$!a$0a$!a$0a$0a$!a$ a$0a$0\x02\x87\xb0a$0a$0a(\xb0a'\xb0a$0"
b'e4qe4be4qe4be4qe4qe4be4ae4qe4q\x06\x97\xf1e4qe4qe8\xf1e7\xf1e4q'
b'\x01D\xb2\x01D\xa3\x01D\xb2\x01D\xa3\x01D\xb2\x01D\xb2\x01D\xa3\x01D\xa2\x01D\xb2\x01D\xb2\n\xa82\x01D\xb2\x01D\xb2\x01I2\x01H2\x01D\xb2'
b'\x05T\xf3\x05T\xe4\x05T\xf3\x05T\xe4\x05T\xf3\x05T\xf3\x05T\xe4\x05T\xe3\x05T\xf3\x05T\xf3\x0e\xb8s\x05T\xf3\x05T\xf3\x05Ys\x05Xs\x05T\xf3'
b'\te\x1a\te%\te\x1a\te%\te\x1a\te\x1a\te%\te$\te\x1a\te\x1a\x12\xc8\x9a\te\x1a\te\x1a\ti\x9a\th\x9a\te\x1a'
b'\ru[\ruf\ru[\ruf\ru[\ru[\ruf\rue\ru[\ru[\x16\xd8\xdb\ru[\ru[\ry\xdb\rx\xdb\ru['
b'\x11\x85\x9c\x11\x85\xa7\x11\x85\x9c\x11\x85\xa7\x11\x85\x9c\x11\x85\x9c\x11\x85\xa7\x11\x85\xa6\x11\x85\x9c\x11\x85\x9c\x1a\xe9\x1c\x11\x85\x9c\x11\x85\x9c\x11\x8a\x1c\x11\x89\x1c\x11\x85\x9c'
b'\x15\x95\xdd\x15\x95\xe8\x15\x95\xdd\x15\x95\xe8\x15\x95\xdd\x15\x95\xdd\x15\x95\xe8\x15\x95\xe7\x15\x95\xdd\x15\x95\xdd\x1e\xf9]\x15\x95\xdd\x15\x95\xdd\x15\x9a]\x15\x99]\x15\x95\xdd'
b'\x18\x06\x1e\x18\x06)\x18\x06\x1e\x18\x06)\x18\x06\x1e\x18\x06\x1e\x18\x06)\x18\x06(\x18\x06\x1e\x18\x06\x1e#\t\x9e\x18\x06\x1e\x18\x06\x1e\x18\n\x9e\x18\t\x9e\x18\x06\x1e'
b"\x1c\x16_\x1c\x16j\x1c\x16_\x1c\x16j\x1c\x16_\x1c\x16_\x1c\x16j\x1c\x16i\x1c\x16_\x1c\x16_'\x19\xdf\x1c\x16_\x1c\x16_\x1c\x1a\xdf\x1c\x19\xdf\x1c\x16_"
b' + + + * +* + * '
经过遍历,发现只有当 n=25 时,输出的结果才会像starry一样的字符串(仅为空格、*、+组合),于是写出脚本解密
with open("flag.txt", "r", encoding="utf-8") as f:
str_encrypt = ""
n = 25
for letter in f.read():
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter
open("flag.starry", "wb").write(base64.decodebytes(str_encrypt.encode()))
最终得到文件(确实如starry名字而言就像星空一样)
+ + + * +* + * +* + * +* + * +
* + * +* + . + + * +* + * +** + . +
+ * +* + * +* + * +* + * +* + * +
* + . + + * +* + * +* + * +* + *
+* + + * +* + * +* + * +* + * +*
+ * +* + + * +* + * +* + * +*
+ * +* + * +* . . + . + + * +** + .
+ + * +* + * +* + * +* + * +*
+ + * +* + * +* + * +* + * +* +
* +* + + * +* + * +* + * +* + *
+* . . + . + + * +* + * +* + * +*
+ * +* + * +* + + * +* + * +*
+ * +* + * +* + * +* + + * +* + *
+* + * +* + * +* . . + . + + *
+* + * +* + * +* + * +* + . +
+ * +* + * +* + * +* + * +* + * +*
+ . + + * +* + * +* + * +* + *
+* + . + + * +* + * +* + * +* + *
+** + . + + * +* + * +* + * +*
+ * +* + . + + * +* + * +* + * +*
+ * +* + + * +* + * +* + * +*
+ * +* . + . + + * +* + * +* + * +*
+ * +* + + * +* + * +* + * +*
+ * +* + + * +* + * +* + * +* +
* +* + + * +* + * +* + * +* + *
+* . . . + . + + * +* + * +* +
* +* + * +* + . + + * +* + * +*
+ * +* + * +* + * +* + . + + * +*
+ * +* + * +* + * +* + + * +* +
* +* + * +* + * +* + * +* + + *
+* + * +* + * +* + * +* . . + . +
+ * +* + * +* + * +* + * +* +
+ * +* + * +* + * +* + * +* +
+ * +* + * +* + * +* + * +* + +
* +* + * +* + * +* + * +* . . . + .
+ + * +* * + . + + * +* + * +* + *
+* + * +* + * +* + + * +* + * +*
+ * +* + * +* + * +* + + * +*
+ * +* + * +* + * +* + + * +*
+ * +* + * +* + * +* + * +* + + *
+* + * +* + * +* + * +* . . .
. + . + + * +* + * +* + * +* + *
+* + * +* + + * +* + * +* + * +
* + * +* + + * +* + * +* + * +*
+ * +* + * +* . . + . + + * +* + * +*
+ * +* + .
下载starry脚本 https://github.com/yhara/esolang-book-sources/blob/master/starry/starry.rb
安装ruby(kali环境下)
apt install ruby
运行脚本(需要ruby语言环境)
ruby strry.rb flag.starry
输出结果 flag{785c45ea-d2a1-4993-8d4f-325323d5bcd9}