CTFshow-Crypto(13-16)

machacha發表於2024-05-31

13crypto12

image-20240531204408398

跟字母替換有關

uozt{Zgyzhv_xlwv_uiln_xguhsld}

26個英文字母和對應的編號_word文件線上閱讀與下載_無憂文件

u-21   f-6
o-15   l-12
z-26   a-1
t-20   g-7

發現對應兩個字母加起來為27

查資料發現這是埃特巴什碼

埃特巴什碼

最後一個字母替換第一個字母,倒數第二個字母替換第二個字母。

明文: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
密文替換明文
密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
線上網站解碼

image-20240531205244346

注意手動替換大小寫

指令碼解碼
a = 'uozt{Zgyzhv_xlwv_uiln_xguhsld}'
b = ''
for i in a:
    if i.islower():
        b += chr((26- (ord(i) - 96))  + 97)
    elif i.isupper():
        b += chr((26- (ord(i) - 64)) + 65)
    else :
        b += i
print(b)

14crypto13

image-20240531210401811

下載附件是兩個檔案,第一個是macOS作業系統的,選擇適合自己系統的就行

開啟base.txt發現有非常長的密文(千萬級別),提示是base家族,肯定是base巢狀

指令碼一
import base64
filename = r"C:\Users\86157\Desktop\base家族\base.txt"
with open(filename) as f:
    s = f.read()
while True:
    try:
        s = base64.b16decode(s)
        continue
    except:
        pass
    try:
        s = base64.b32decode(s)
        continue
    except:
        pass
    try:
        s = base64.b64decode(s)
        continue
    except:
        pass
    break
print(s)

字首rR用於定義一個原始字串(raw string)。原始字串不會處理反斜槓(\)為跳脫字元。

base64.b16decode()

獲得二進位制形式的解碼字串。

讀取檔案

Python檔案讀寫詳解(非常詳細)_python 瞭解檔案讀寫-CSDN部落格

read方法

【Python】一文詳細介紹 File物件的read()方法_python file.read(buffer)-CSDN部落格

指令碼二
import re, base64 //匯入正規表示式模組re和Base64編碼/解碼模組base64
s = open("base.txt", "rb").read()
//使用二進位制模式("rb")開啟名為base.txt的檔案,並讀取其全部內容。讀取的內容儲存在位元組串s中。
\# 正規表示式,用來儘可能多的匹配字串
base16_dic = r'^[A-F0-9]*$'
base32_dic = r'^[A-Z2-7=]*$'
base64_dic = r'^[A-Za-z0-9/+=]*$'
\# 迴圈解碼
while True:
    t = s.decode() #將位元組串s解碼為字串t 
    if '{' in t:  #如果字串t中包含字元'{',則列印t並退出迴圈  
        print(t)
        break
     # 否則,根據t的格式使用不同的解碼方法
    elif re.match(base16_dic, t):
        s = base64.b16decode(s)
        print(16)
    elif re.match(base32_dic, t):
        s = base64.b32decode(s)
        print(32)
    elif re.match(base64_dic, t):
        s = base64.b64decode(s)
        print(64)

image-20240531215741147

在處理二進位制檔案時,開啟檔案時需要指定'rb'模式。

正規表示式(指令碼中出現的)

正規表示式 – 語法 | 菜鳥教程 (runoob.com)

[A-Z] 表示一個區間,匹配所有大寫字母
[^ABC]匹配除了 [...] 中字元的所有字元,例如 [^aeiou] 匹配字串 "google runoob taobao" 中除了 e o u a 字母的所有字元。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 號代表前面的字元可以不出現,也可以出現一次或者多次(0次、或1次、或多次)
base32_dic = r'^[A-Z2-7=]*$
匹配一個字串,該字串完全由大寫字母 A 到 Z、數字 2 到 7 和等號 = 組成,並且這個字串沒有其他任何字元。
  1. r 字首:這是一個原始字串字首,它告訴Python不要解釋反斜槓(\)為跳脫字元。這在正規表示式中特別有用,因為反斜槓在正規表示式中通常用作跳脫字元。
  2. ^:匹配字串的開始位置。
  3. [A-Z2-7=]:這是一個字符集,它匹配任何在括號內的字元。具體來說,它匹配以下字元:
    • 大寫字母 A 到 Z
    • 數字 2 到 7
    • 等號 =
  4. *:表示前面的字符集([A-Z2-7=])可以出現零次或多次。
  5. $:匹配字串的結束位置。
工具

感興趣的可以下載

mufeedvh/basecrack: Decode All Bases - Base Scheme Decoder (github.com)

15crypto14

題目:

00110011 00110011 00100000 00110100 00110101 00100000 00110101 00110000 00100000 00110010 01100110 00100000 00110011 00110011 00100000 00110101 00110110 00100000 00110100 01100101 00100000 00110100 00110110 00100000 00110100 00110110 00100000 00110110 01100100 00100000 00110100 01100101 00100000 00110100 00110101 00100000 00110100 00110001 00100000 00110110 01100101 00100000 00110110 01100011 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110100 00100000 00110100 00110011 00100000 00110100 01100100 00100000 00110110 01100100 00100000 00110101 00110110 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110001 00100000 00110110 00110100 00100000 00110011 00111001 00100000 00110111 00110101 00100000 00110100 00110111 00100000 00110000 01100001

一串二進位制數,先轉成字串

字串二進位制轉換 (lddgo.net)

33 45 50 2f 33 56 4e 46 46 6d 4e 45 41 6e 6c 48 44 35 64 43 4d 6d 56 48 44 35 61 64 39 75 47 0a

baseX特徵

base16:字母A-F、數字0-9
base32:字母A-Z、數字2-7、符號=
base64:字母A-Z、a-z、數字0-9、符號/+=

判斷為base64進行解碼

3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG

或者直接一步到位

image-20240531223655976

直接base64解碼不行,需要根據base64編碼表 對這串程式碼進行移位替換

base64編碼表

image-20240531223803755

密文開頭是 3EP/ 而flag的base64編碼為:ZmxhZw==

3-55  Z-25    55-30=25
E-4   m-38    4-30+64=38

偏移量為30

指令碼
import base64
s = '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG'
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
flag = ''
for i in s:
    flag += a[(a.index(i) - 30) % 64]
if len(flag) % 4 != 0:
    flag += '=' * (4 - len(flag) % 4)
print(flag)
print(base64.b64decode(flag).decode('UTF-8'))

index()

a.index(i) 會返回 i 第一次出現在 a 中的索引(從0開始計數)

python取模

在Python中,% 運算子用於取模,並且對於負數被除數,結果的符號與被除數相同。

使用Python的%運算子,-26 % 64 的結果是:38

16萌新_密碼5

image-20240531225353340

由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大
工具梭哈

image-20240531225556184

當鋪密碼

當前漢字有多少筆畫出頭,就是轉化成數字幾,再Ascii解碼

例如:口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9

由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大
102   108   97   ...  
指令碼
dh = '田口由中人工大土士王夫井羊壯'
ds = '00123455567899'

cip = '由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大'
s = ''
for i in cip:
	if i in dh:
		s += ds[dh.index(i)]
	else:
		s += ' '
print(s)

ll = s.split(" ")
print(ll)
t = ''
for i in range(0,len(ll)):
	t += chr(int(ll[i]))
print(t)