实验吧WriteUp合集

本篇博客主要用来记录在实验吧上做的题目的步骤,和一些在做题过程中的体会。此篇博客会持续更新!

Web

密码学

传统知识+古典密码

  1. 题目链接: http://www.shiyanbar.com/ctf/1991
  2. 题目描述:
      小明某一天收到一封密信,信中写了几个不同的年份辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。信的背面还写有“+甲子”,请解出这段密文。

0x00 题目分析

  通过题目名称和描述可知,这是一个与六十甲子有关的题目(传统知识),并且用到了古典加密。一般这种题应该首先按照题目所给顺序得到六十甲子序号序列。

0x01 对照六十甲子表


六十甲子顺序表
辛卯 癸巳 丙戌 辛未 庚辰 癸酉 己卯 癸巳
28 30 23 08 17 10 16 30

0x02 “+甲子”

  这句话的意思是给其序列的每一个序号加一个”甲子”,也就是60年。

辛卯 癸巳 丙戌 辛未 庚辰 癸酉 己卯 癸巳
28 30 23 08 17 10 16 30
88 90 83 68 77 70 76 90

  但是呢,得到这组数又有啥用呢,古典密码学有的只是一串字符啊,咱们可以想想,数字和字符怎么有对应关系呢?于是我们可以想到ASCII

辛卯 癸巳 丙戌 辛未 庚辰 癸酉 己卯 癸巳
28 30 23 08 17 10 16 30
88 90 83 68 77 70 76 90
X Z S D M F L Z

0x03 解密

XZSDMFLZ得到这么一串字符,可是好像没啥规律啊,用CTFCrackTools先尝试一下栅栏解密,得到如下结果
  得到因数(排除1和字符串长度):
  2 4
  第1栏:XSMLZDFZ
  第2栏:XMZFSLDZ
继续用得到的两个字符串分别进行凯撒解密,发现第二个字符串解得的字符串中有一个是有规律的


最后结果

0x04 总结

  此题首先将flag进行凯撒加密,然后又用栅栏加密,将得到的密文中选择了一个进行字符->ASCII(对应的10进制),又将每项减去60,产生六十甲子序列的序号序列,再转换成六十甲子序列。

try them all

  1. 题目链接: http://www.shiyanbar.com/ctf/1981
  2. 题目描述:
      You have found a passwd file containing salted passwords. An unprotected configuration file has revealed a salt of 5948. The hashed password for the ‘admin’ user appears to be 81bdf501ef206ae7d3b92070196f7e98, try to brute force this password.

0x00 翻译(毕竟英语差,顺便学习学习英语)

  大意是:你发现了一个包含了加盐密码的密码文件。一个不受保护的配置文件透漏了这个加盐密码为5948,用户“admin”的密码的hash值是81bdf501ef206ae7d3b92070196f7e98,尝试用暴力破解破解此密码。

0x01 解密

  看样子是MD5加密,拿到ChaMD5解密(用的是MD5-32加密的),得到明文sniper5948。题目说用了salt加密,并且加盐密码是5948,将它去了就是“admin”用户的密码。

trivial

  1. 题目链接: http://www.shiyanbar.com/ctf/1980
  2. 题目描述:
    An unlocked terminal is displaying the following:
    Encryption complete, ENC(???,T0pS3cre7key) = Bot kmws mikferuigmzf rmfrxrwqe abs perudsf! Nvm kda ut ab8bv_w4ue0_ab8v_DDU
    You poke around and find this interesting file.

0x00 翻译

  大意是:一个未锁的终端显示了如下的信息。
  加密完成,ENC(???,T0pS3cre7key) = Bot kmws mikferuigmzf rmfrxrwqe abs perudsf! Nvm kda ut ab8bv_w4ue0_ab8v_DDU

0x01 题目分析

  可以在上面链接中得到一个压缩包,里面有一个名为encrypt.py的python源文件,先来测试一下其功能:


测试功能

encrypt.py源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
import sys

alphaL = "abcdefghijklnmopqrstuvqxyz"
alphaU = "ABCDEFGHIJKLMNOPQRSTUVQXYZ"
num = "0123456789"
keychars = num+alphaL+alphaU

if len(sys.argv) != 3:
print "Usage: %s SECRET_KEY PLAINTEXT"%(sys.argv[0])
sys.exit()

key = sys.argv[1]
if not key.isalnum():
print "Your key is invalid, it may only be alphanumeric characters"
sys.exit()

plaintext = sys.argv[2]

ciphertext = ""
for i in range(len(plaintext)):
rotate_amount = keychars.index(key[i%len(key)])
if plaintext[i] in alphaL:
enc_char = ord('a') + (ord(plaintext[i])-ord('a')+rotate_amount)%26
elif plaintext[i] in alphaU:
enc_char = ord('A') + (ord(plaintext[i])-ord('A')+rotate_amount)%26
elif plaintext[i] in num:
enc_char = ord('0') + (ord(plaintext[i])-ord('0')+rotate_amount)%10
else:
enc_char = ord(plaintext[i])
ciphertext = ciphertext + chr(enc_char)

print "Encryption complete, ENC(%s,%s) = %s"%(plaintext,key,ciphertext)

  经过测试功能,可以分析出源码是怎样对明文进行加密的。encrypt.py SECRET_KEY PLAINTEXT(第一个参数是加密文件名,第二个参数是密钥,第三个参数是明文)。Encryption complete, ENC(mkks,123a) = nmnc(mkks是明文,123a是密钥,nmnc是密文)。所以根据题目现在知道了密文和密钥,让我们求明文。可以根据加密算法写一段解密的代码(代码是借鉴别人的,本人现在还小白一个)。

假设pla是b,key是a(即rotate_amount为10),那么根据源代码:

1
enc_char = ord('a') + (ord(plaintext[i])-ord('a')+rotate_amount)%26

算出来chr(enc_char)为l。换句话来说,从密文换到原文也就是:

1
enc_char = ord('a') + (ord(ciphertext[i])-ord('a')-rotate_amount)%26

把加号换成减号就行。

0x02 编写解密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
import sys

alphaL = "abcdefghijklnmopqrstuvqxyz"
alphaU = "ABCDEFGHIJKLMNOPQRSTUVQXYZ"
num = "0123456789"
keychars = num+alphaL+alphaU


key = 'T0pS3cre7key'

plaintext = ''

ciphertext = "Bot kmws mikferuigmzf rmfrxrwqe abs perudsf! Nvm kda ut ab8bv_w4ue0_ab8v_DDU"
for i in range(len(ciphertext)):
rotate_amount = keychars.index(key[i%len(key)])
if ciphertext[i] in alphaL:
enc_char = ord('a') + (ord(ciphertext[i])-ord('a')-rotate_amount)%26
elif ciphertext[i] in alphaU:
enc_char = ord('A') + (ord(ciphertext[i])-ord('A')-rotate_amount)%26
elif ciphertext[i] in num:
enc_char = ord('0') + (ord(ciphertext[i])-ord('0')-rotate_amount)%10
else:
enc_char = ord(ciphertext[i])
plaintext = plaintext + chr(enc_char)

print(plaintext)

安全杂项

逆向工程

隐写术

编程

溢出

文章目录
  1. Web
  2. 密码学
    1. 传统知识+古典密码
      1. 0x00 题目分析
      2. 0x01 对照六十甲子表
      3. 0x02 “+甲子”
      4. 0x03 解密
      5. 0x04 总结
    2. try them all
      1. 0x00 翻译(毕竟英语差,顺便学习学习英语)
      2. 0x01 解密
    3. trivial
      1. 0x00 翻译
      2. 0x01 题目分析
      3. 0x02 编写解密代码
  3. 安全杂项
  4. 逆向工程
  5. 隐写术
  6. 编程
  7. 溢出