OverTheWire-Krypton


前言

本篇文章为OverTheWire网站Krypton关卡的学习记录。

  • 通过ssh kryptonX@krypton.labs.overthewire.org 2231 进行登录。
  • 参考Writeup有krypton(0-6)

Level 0 -> Level 1

  • 提示S1JZUFRPTklTR1JFQVQ=是经过base64编码的密码。
  • 通过在线Base64工具解码得到密码。
KRYPTONISGREAT

Level 1 -> Level 2

Username: krypton1
Password: KRYPTONISGREAT
ssh krypton1@krypton.labs.overthewire.org 2231

  • 提示经过了ROT13加密。
  • 通过在线ROT13工具对密文进行解密得到密码。
  • 密码不是整句话,而是最后的单词。
YRIRY GJB CNFFJBEQ EBGGRA
LEVEL TWO PASSWORD ROTTEN

Level 2 -> Level 3

Username: krypton2
Password: ROTTEN
ssh krypton2@krypton.labs.overthewire.org 2231

  • 这一关通过创建明文文件"ABCDE",使用encrypt对其加密,得到密文。
  • 并通过ltrace进行跟踪,可以发现对应的转换表为M-ZA-L。
  • 通过在线ROT13对krypton3进行转换得到密码。
krypton3@krypton:/krypton/krypton2$ mktemp -d
/tmp/tmp.6aT5moYByG
krypton3@krypton:/krypton/krypton2$ cd /tmp/tmp.6aT5moYByG
krypton3@krypton:/tmp/tmp.6aT5moYByG$ touch plaintext
krypton3@krypton:/tmp/tmp.6aT5moYByG$ echo "ABCDEFG" > plaintext 
krypton3@krypton:/tmp/tmp.6aT5moYByG$ cat plaintext
ABCDEFG
krypton3@krypton:/tmp/tmp.6aT5moYByG$ ln -s /krypton/krypton2/keyfile.dat 
krypton3@krypton:/tmp/tmp.6aT5moYByG$ /krypton/krypton2/encrypt plaintex
krypton3@krypton:/tmp/tmp.6aT5moYByG$ ls
ciphertext  keyfile.dat  plaintext
krypton3@krypton:/tmp/tmp.6aT5moYByG$ cat ciphertext 
MNOPQRS
CAESARISEASY

Level 3 -> Level 4

Username: krypton3
Password: CAESARISEASY
ssh krypton3@krypton.labs.overthewire.org 2231

  • 这一关需要通过词频分析推断出每个字母对应的转换值。(参考其他资料说明)
  • 将得到的明文进行分组,最后单词为密码。
密文: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文: B O I H G K N Q V T W Y U R X Z A J E M S L D F P C 

cat krypton4 | tr '[A-Z]' '[BOIHGKNQVTWYURXZAJEMSLDFPC]'
WELLD ONETH ELEVE LFOUR PASSW ORDIS BRUTE
WELL DONE THE LEVEL FOUR PASSWORD IS BRUTE

Level 4 -> Level 5

Username: krypton4
Password: BRUTE
ssh krypton4@krypton.labs.overthewire.org 2231

  • 这一关需要百度及参考其他资料分析,这里只做简单记录。
  • 得到密钥FREKEY后,通过脚本算出明文密码CLEARTEXT
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

key = 'FREKEY'
cipher = "HCIKVRJOX"

def decoding_vigenere(cipher, key):
    '''decoding vigenere cipher with key'''

    def getKeyDict(alpha):
        shift = ord(alpha) - ord('A')
        keyDict = {}
        # 获取字母A-Z 加上key 对应的 密文字母
        for i in range(ord('A'), ord('A') + 26):
            keyDict[chr(i)] = chr(i + shift) if i + shift <= ord('Z') else chr(i + shift - 26)
        # exchang the key and value
        keyDict = dict(map(lambda t: (t[1], t[0]), keyDict.items()))
        return keyDict

    keyLen = len(key)
    cipLen = len(cipher)
    keyList = [getKeyDict(key[i]) for i in range(keyLen)]
    plainText = ''

    for i in range(cipLen):
        print(keyList[i % keyLen][cipher[i]])
        plainText += keyList[i % keyLen][cipher[i]]

    print(plainText)

decoding_vigenere(cipher, key)

Level 5 -> Level 6

Username: krypton5
Password: CLEARTEXT
ssh krypton5@krypton.labs.overthewire.org 2231

  • 本关和上一关差不多,但是没有告知密钥长度。(这一关同样需要参考其他资料进行分析,这里只做简单记录)
  • 得到密钥为KEYLENGTH,利用krypton4的脚本进行解码,得到RANDOM
krypton5@krypton:/krypton/krypton5$ cat krypton6 
BELOS Z

Level 6 -> Level 7

Username: krypton6
Password: RANDOM
ssh krypton6@krypton.labs.overthewire.org 2231

  • 在临时目录下创建一个 包含256个‘A’字符的文件,并用encrypt6进行加密,观察得到的密文。
  • 密文中“EICTDGYIYZKTHNSIRFXYCPFUEOCKRN”不断重复,猜测这个是密钥,然后按照前几题的思路,通过脚本进行解密,得到下一关的密码。(参考其他资料)
krypton6@krypton:/tmp$ cat plan
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
krypton6@krypton:/krypton/krypton6$ ./encrypt6 /tmp/plan /tmp/test1
krypton6@krypton:/krypton/krypton6$ cat /tmp/test1
EICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGY
IYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRF
string="PNUKLYLWRQKGKBE" #密文
key="EICTDGYIYZKTHNSIRFXYCPFUEOCKRN" #与‘A’对应的字符
for i in range(len(string)):
    sub=ord(string[i])-(ord(key[i%len(key)])-ord('A'))
    if(sub<ord('A')):
        sub=sub+26
    print(chr(sub),end='')
LFSRISNOTRANDOM

总结

  • 题目主要是简单加解密分析,其中词频分析需要知道相应字母的频率才能分析出对应的替换字母。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值