文章目录
前言
本篇文章为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
总结
- 题目主要是简单加解密分析,其中词频分析需要知道相应字母的频率才能分析出对应的替换字母。