crypto-crypto_crossword(b01lers ctf 2020)

比较新颖的一个题目,内容如下:

Crypto-crossword   (by a0su, maczilla, dm)
----------------

Can use use the clues to decode the flag?


     1   2   3   4   5
   +---+---+---+---+---+  }
   |   |   |   |   |   |  |   
   |---+---+---+---+---|  |     
 6 |   |   |   |   |   |  |
   |---+---+---+---+---|  \
 7 |   |   |   |   |   |   -> WKYQMRKNQLMESZLBSTIKSIPTSLELQLEFEHZZQPNBEZKNOTKJVDHWWRVAULIHXUTYUIHCJMEIXTHDVWCANBMHS
   |---+---+---+---+---|  /   
 8 |   |   |   |   |   |  |
   |---+---+---+---+---|  |
 9 |   |   |   |   |   |  |
   +---+---+---+---+---+  }

 
 1: ;fH;aCh7-"@UWb^G@>N&F#kFRDf'?"DIal3D]iJ!C3=T>+EqL-F<G%(Ci=3(F!,RC+EqL;D'3b7+B;0.==s

 2: GUR FZNYYRFG EFN RKCBARAG RIRE VA JVQRFCERNQ HFR.

 3: 4261636b77617264733a2074776f20666f722062696e6172792c2074656e20666f7220646563696d616c2c20616e64
    207369787465656e20666f72206865782e20

 4: KLHHRYOB GSV URIHG QZEZHXIRKG UFMXGRLM BLF VEVI XZOOVW.

 5: Ecceilnort cdemnostu ahtt eoprv ehinoprsw fo ,eksy cddeeru ot efiv .eelrstt

 6: FRPPRQ UHVHUYHG ZRUG LQ F++ DQG SBWKRQ.

 7: TW9kZXJuIGNyeXB0byBlc3BlY2lhbGx5IGxpa2VzIGdyb3VwcyBvZiBwcmltZSBfX19fXy4=

 8: ooOo00oo0oOo0ooo0O0000oooo0oO0oOoo0ooOo0000OOO0ooOo0000oO0000ooOo0oO0OO0OOO0ooO0ooo0000OOO0oOO
    o0o0Oo0ooo0ooo0oOoo0000oooO0ooO0oOoo0Oo0o0oOo0oO0Oooo00oo0oOoo00oo0O0OoOO0oOoOoO0

 9: 7x4 2x1 6x1 3x2 # 2x1 7x4 # 2x1 6x2 7x4 9x1 3x2 7x3 # 6x2 8x2 6x1 2x2 3x2 7x3 # 3x3 4x3 8x3 3x2 
    1x1

提示图片:
bliss winxp
看到这个题目大概的理解是需要完成一个5x5的填词游戏,填写的内容应该是和下方9个小题有关。

第一题

;fH;aCh7-"@UWb^G@>N&F#kFRDf'?"DIal3D]iJ!C3=T>+EqL-F<G%(Ci=3(F!,RC+EqL;D'3b7+B;0.==s

看到这种都是可打印字符的密文大概率是Base系列编码,大概对比了一下应该是用的Base85。
Base85
解密看一下:

import base64
cipher_text=b';fH;aCh7-"@UWb^G@>N&F#kFRDf\'?"DIal3D]iJ!C3=T>+EqL-F<G%(Ci=3(F!,RC+EqL;D\'3b7+B;0.==s'

###ASCII85型(ctf常用)
c = base64.a85decode(cipher_text).decode() #解密
#m = base64.a85encode(plain_text.encode('utf-8')).decode()#加密
 
###RFC1924型(没什么卵用,就是花里胡哨)
#c = base64.b85decode(cipher_text).decode() #解密
#m = base64.b85encode(plain_text.encode('utf-8')).decode()#加密

'''
Spelled backwards: command to adjust what belongs to whom on UNIX.
'''

反过来读:Unix中调整什么归属于谁的命令,那么也就是chown反过来,即nwohc。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n |   |   |   |   |  |   
   |---+---+---+---+---|  |     
 6 | w |   |   |   |   |  |
   |---+---+---+---+---|  \
 7 | o |   |   |   |   |   
   |---+---+---+---+---|  /   
 8 | h |   |   |   |   |  |
   |---+---+---+---+---|  |
 9 | c |   |   |   |   |  |
   +---+---+---+---+---+  }

第二题

GUR FZNYYRFG EFN RKCBARAG RIRE VA JVQRFCERNQ HFR.

这个题看上就就是个置换密码,试了一下几种算法发现就是简单的rot13。

message='GUR FZNYYRFG EFN RKCBARAG RIRE VA JVQRFCERNQ HFR.'
import codecs
codecs.encode(message, 'rot_13')
#THE SMALLEST RSA EXPONENT EVER IN WIDESPREAD USE.

普遍使用的最小的RSA加密指数,这地方大概判断一下应该是three,刚好五个字母。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n | t |   |   |   |  |   
   |---+---+---+---+---|  |     
 6 | w | h |   |   |   |  |
   |---+---+---+---+---|  \
 7 | o | r |   |   |   |   
   |---+---+---+---+---|  /   
 8 | h | e |   |   |   |  |
   |---+---+---+---+---|  |
 9 | c | e |   |   |   |  |
   +---+---+---+---+---+  }

第三题

4261636b77617264733a2074776f20666f722062696e6172792c2074656e20666f7220646563696d616c2c20616e64207369787465656e20666f72206865782e20

试一下直接转字符。

from Crypto.Util.number import *

s=long_to_bytes(0x4261636b77617264733a2074776f20666f722062696e6172792c2074656e20666f7220646563696d616c2c20616e64207369787465656e20666f72206865782e20)
#Backwards: two for binary, ten for decimal, and sixteen for hex.

也是反过来:二进制中的2,十进制中的10,十六进制中的16。说的应该是基数或者底数,找到5个字母的单词radix,反过来就是xidar。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n | t | x |   |   |  |   
   |---+---+---+---+---|  |     
 6 | w | h | i |   |   |  |
   |---+---+---+---+---|  \
 7 | o | r | d |   |   |   
   |---+---+---+---+---|  /   
 8 | h | e | a |   |   |  |
   |---+---+---+---+---|  |
 9 | c | e | r |   |   |  |
   +---+---+---+---+---+  }

第四题

KLHHRYOB GSV URIHG QZEZHXIRKG UFMXGRLM BLF VEVI XZOOVW.

这次也是替换密码,但不是rot13了。试一下爆破quipiup。得到结果: POSSIBLY THE FIRST JAVASCRIPT FUNCTION YOU EVER CALLED.
第一次使用的js函数?反正写helloworld的时候要不就是log要不就是alert,按照字母个数肯定选alert。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n | t | x | a |   |  |   
   |---+---+---+---+---|  |     
 6 | w | h | i | l |   |  |
   |---+---+---+---+---|  \
 7 | o | r | d | e |   |   
   |---+---+---+---+---|  /   
 8 | h | e | a | r |   |  |
   |---+---+---+---+---|  |
 9 | c | e | r | t |   |  |
   +---+---+---+---+---+  }

第五题

Ecceilnort cdemnostu ahtt eoprv ehinoprsw fo ,eksy cddeeru ot efiv .eelrstt

目测就是把一句话中每个单词的字母顺序打乱,尚未发现有专门的工具处理这种情况。肉眼排序:
Electronic documents that prove ownership of keys, reduced to five letters.

证明密钥所有者的电子文档,这不就是证书?certificate简化为五个字母,linux中保存证书的目录/etc/pki/tls/certs。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n | t | x | a | c |  |   
   |---+---+---+---+---|  |     
 6 | w | h | i | l | e |  |
   |---+---+---+---+---|  \
 7 | o | r | d | e | r |   
   |---+---+---+---+---|  /   
 8 | h | e | a | r | t |  |
   |---+---+---+---+---|  |
 9 | c | e | r | t | s |  |
   +---+---+---+---+---+  }

实际到此为止已经填满了所有格子,其他几题感兴趣的话可以继续看一下。

第六题

FRPPRQ UHVHUYHG ZRUG LQ F++ DQG SBWKRQ.

替换密码,老规矩上quipiup。得到结果:COMMON RESERVED WORD IN C++ AND PYTHON.

C++和python中的保留字,五个字母的很明确就是while。

第七题

TW9kZXJuIGNyeXB0byBlc3BlY2lhbGx5IGxpa2VzIGdyb3VwcyBvZiBwcmltZSBfX19fXy4=

等号结尾直接上base64

import base64
cipher_text=b'TW9kZXJuIGNyeXB0byBlc3BlY2lhbGx5IGxpa2VzIGdyb3VwcyBvZiBwcmltZSBfX19fXy4='

c = base64.b64decode(cipher_text).decode() 
#Modern crypto especially likes groups of prime _____.

这地方填order具体原因不深究。

第八题

ooOo00oo0oOo0ooo0O0000oooo0oO0oOoo0ooOo0000OOO0ooOo0000oO0000ooOo0oO0OO0OOO0ooO0ooo0000OOO0oOOo0o0Oo0ooo0ooo0oOoo0000oooO0ooO0oOoo0Oo0o0oOo0oO0Oooo00oo0oOoo00oo0O0OoOO0oOoOoO0

应该是摩斯密码变形,不深究。

第九题

7x4 2x1 6x1 3x2 # 2x1 7x4 # 2x1 6x2 7x4 9x1 3x2 7x3 # 6x2 8x2 6x1 2x2 3x2 7x3 # 3x3 4x3 8x3 3x2 1x1

手机键盘密码,对照看一下就知。
手机键盘
得到结果很蛋疼SAME # AS # ANSWER # NUMBER # FIVE

求明文

通过提示图片可知最后一步考的是希尔密码(图中小山也就是hill),就要将以下格子转换为加密矩阵。

     1   2   3   4   5
   +---+---+---+---+---+  }
   | n | t | x | a | c |  |   
   |---+---+---+---+---|  |     
 6 | w | h | i | l | e |  |
   |---+---+---+---+---|  \
 7 | o | r | d | e | r |   
   |---+---+---+---+---|  /   
 8 | h | e | a | r | t |  |
   |---+---+---+---+---|  |
 9 | c | e | r | t | s |  |
   +---+---+---+---+---+  }

加密矩阵为: K = [ 13 19 23 0 2 22 7 8 11 4 14 17 3 4 17 7 4 0 17 19 2 4 17 19 18 ] K= \begin{bmatrix} 13 & 19 & 23 & 0 & 2 \\ 22 & 7 & 8 & 11 & 4 \\ 14 & 17 & 3 & 4 & 17 \\ 7 & 4 & 0 & 17 & 19 \\ 2 & 4 & 17 & 19 & 18 \end{bmatrix} K=13221472197174423830170114171924171918

解密过程实际就是密文每5个字母分一组,与密钥矩阵的逆相乘得到明文。脚本为:

from sympy import Matrix

alphabet_length = 26

def decrypt(matrix, words):
    cipher = ""
    M = Matrix(matrix)
    M = M.inv_mod(alphabet_length)
    length = len(M)
    d = {}
    d2 = {}
    alph = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    for x in range(len(alph)):
        d[alph[x]] = x
        d2[x] = alph[x]
    # print d
    count = 0
    l = []

    for ch in words:
        if (count + 1) % (5 + 1) == 0:
            m = Matrix(l)
            dot_pr_m = M * m
            n = []
            for i in dot_pr_m:
                cipher += d2[i % alphabet_length]
            count = 0
            l = []
        l.append(d[ch])
        count += 1
    if (count + 1) % (5 + 1) == 0:
        m = Matrix(l)
        dot_pr_m = M * m
        n = []
        for i in dot_pr_m:
            cipher += d2[i % alphabet_length]
    return cipher


if __name__ == "__main__":
    key = [
        [13, 19, 23, 0, 2],
        [22, 7, 8, 11, 4],
        [14, 17, 3, 4, 17],
        [7, 4, 0, 17, 19],
        [2, 4, 17, 19, 18],
    ]
    ciphertext = "WKYQMRKNQLMESZLBSTIKSIPTSLELQLEFEHZZQPNBEZKNOTKJVDHWWRVAULIHXUTYUIHCJMEIXTHDVWCANBMHS"
    m=decrypt(key, ciphertext)
# MESSAGEXISXNOXBLACKXSQUARESXAMIGOXSEPARATEDXBYXSPACEXANDXENCLOSEDXINXTHEXUSUALXFORMAT

X是分隔符,去掉以后明文就是:MESSAGE IS NO BLACK SQUARES AMIGO SEPARATED BY SPACE AND ENCLOSED IN THE USUAL FORMAT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值