华中科技大学第一届网络安全挑战赛-CTF Misc-一闪一闪亮晶晶 WP

Misc-一闪一闪亮晶晶
题目描述:凯撒大帝想学习一下Starry语言,你能帮帮他么吗
可知解题思路:凯撒加密+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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值