CTF-Writeup


[SWPUCTF 2021 新生赛]jicao

访问主页是一段php代码,包含了flag.php文件,设定了一个POST请求的id和GET请求的json语句会对GET请求的数据进行json解码。如果id和json变量的值都等于设定字符串,打印flag

1
2
3
4
5
6
7
8
<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

直接使用hacker插件进行传参

真是阳间题

题内容:

1
2
3
艾尔登法环正式发售在即,迫不及待的mjj身上好像有蚂蚁在爬,写下了一句谜语:
3207357975641587136122466514425152961654613410728337142271750273124995105747053991640817066352343657398947248938255086358418100814441196784643527787764297
谜底就是flag,也是他给所有新生的祝福,希望大家享受解码的过程。

发现10进制,我们用python脚本转换为16进制

点击查看python脚本

进制转换脚本

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import tkinter as tk
from tkinter import ttk, messagebox


class BaseConverter:
def __init__(self, master):
self.master = master
master.title("进制转换器 v1.0")
master.geometry("400x220")
self.create_widgets()

def create_widgets(self):
# 输入框标签
self.lbl_input = ttk.Label(self.master, text="输入数值:")
self.lbl_input.grid(row=0, column=0, padx=10, pady=10, sticky="w")

# 输入框
self.entry_input = ttk.Entry(self.master, width=25)
self.entry_input.grid(row=0, column=1, padx=10, pady=10)

# 输入进制选择
self.input_base = tk.StringVar()
self.cmb_input = ttk.Combobox(self.master, textvariable=self.input_base,
values=["二进制", "八进制", "十进制", "十六进制"],
state="readonly")
self.cmb_input.current(0)
self.cmb_input.grid(row=0, column=2, padx=10, pady=10)

# 输出进制选择
self.output_base = tk.StringVar()
self.cmb_output = ttk.Combobox(self.master, textvariable=self.output_base,
values=["二进制", "八进制", "十进制", "十六进制"],
state="readonly")
self.cmb_output.current(3)
self.cmb_output.grid(row=1, column=2, padx=10, pady=10)

# 转换按钮
self.btn_convert = ttk.Button(self.master, text="转换", command=self.convert)
self.btn_convert.grid(row=2, column=1, pady=15)

# 结果展示
self.lbl_result = ttk.Label(self.master, text="转换结果:", font=('Arial', 10, 'bold'))
self.lbl_result.grid(row=3, column=0, padx=10, sticky="w")

self.txt_result = tk.Text(self.master, height=2, width=30)
self.txt_result.grid(row=3, column=1, columnspan=2, padx=10)

def validate_input(self, value, base):
"""输入验证"""
base_map = {
"二进制": {'chars': {'0', '1'}, 'prefix': '0b'},
"八进制": {'chars': {'0', '1', '2', '3', '4', '5', '6', '7'}, 'prefix': '0o'},
"十进制": {'chars': set("0123456789"), 'prefix': ''},
"十六进制": {'chars': set("0123456789abcdefABCDEF"), 'prefix': '0x'}
}

# 去除可能的空白字符
value = value.strip()
if not value:
return False

# 检查允许的字符集
allowed_chars = base_map[base]['chars']
if not all(c in allowed_chars for c in value.upper() if c not in {' ', '_'}):
return False

return True

def convert(self):
"""执行转换"""
input_value = self.entry_input.get()
input_base = self.input_base.get()
output_base = self.output_base.get()

try:
# 输入验证
if not self.validate_input(input_value, input_base):
raise ValueError("输入值不符合所选进制规则")

# 转换到十进制
base_map = {"二进制": 2, "八进制": 8, "十进制": 10, "十六进制": 16}
decimal_value = int(input_value, base_map[input_base])

# 转换到目标进制
if output_base == "二进制":
result = bin(decimal_value)[2:]
elif output_base == "八进制":
result = oct(decimal_value)[2:]
elif output_base == "十进制":
result = str(decimal_value)
elif output_base == "十六进制":
result = hex(decimal_value)[2:].upper()

# 显示结果
self.txt_result.delete(1.0, tk.END)
self.txt_result.insert(tk.END, result)

except ValueError as e:
messagebox.showerror("错误", f"转换失败: {str(e)}")
except Exception as e:
messagebox.showerror("系统错误", f"发生未预期的错误: {str(e)}")


if __name__ == "__main__":
root = tk.Tk()
app = BaseConverter(root)
root.mainloop()
1
3D3D3D3D513642475354334F4859464D37435A415450424F4454344348324D4E37434E36565A414F5A3358474859344B374B354144474E504553554355495A49

试一下将16进制转成ASCII码

点击展开脚本

16进制转ASCII脚本:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import tkinter as tk
from tkinter import messagebox, scrolledtext

def hex_to_ascii(hex_str):
try:
# 将十六进制字符串转换为字节
bytes_obj = bytes.fromhex(hex_str)
# 将字节转换为ASCII字符串
ascii_str = bytes_obj.decode('ascii', errors='replace')
return ascii_str
except ValueError:
return "错误:无效的十六进制字符串"
except UnicodeDecodeError:
return "错误:包含非ASCII字符"

def convert():
input_hex = entry.get()
result = hex_to_ascii(input_hex)
output_text.delete(1.0, tk.END)
output_text.insert(tk.END, result)

def copy_result():
result = output_text.get(1.0, tk.END).strip()
if result:
root.clipboard_clear()
root.clipboard_append(result)
messagebox.showinfo("复制成功", "结果已复制到剪贴板")

# 创建主窗口
root = tk.Tk()
root.title("十六进制转ASCII工具")
root.geometry("600x400")

# 创建界面组件
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

# 输入标签和输入框
input_label = tk.Label(frame, text="输入十六进制字符串:")
input_label.pack()
entry = tk.Entry(frame, width=50)
entry.pack(pady=5)

# 转换按钮
convert_btn = tk.Button(frame, text="转换", command=convert)
convert_btn.pack(pady=5)

# 输出文本框
output_label = tk.Label(frame, text="转换结果:")
output_label.pack()
output_text = scrolledtext.ScrolledText(frame, width=50, height=10)
output_text.pack(pady=5)

# 复制按钮
copy_btn = tk.Button(frame, text="复制结果", command=copy_result)
copy_btn.pack(pady=5)

# 运行主循环
root.mainloop()

发现是反过来的base64

1
====Q6BGST3OHYFM7CZATPBODT4CH2MN7CN6VZAOZ3XGHY4K7K5ADGNPESUCUIZI

我们在把字符串反转过来

点击展开python脚本

字符串反转脚本

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import tkinter as tk
from tkinter import ttk, messagebox


class StringReverser:
def __init__(self, master):
self.master = master
master.title("字符串反转工具 v1.0")
master.geometry("400x200")
self.create_widgets()

def create_widgets(self):
# 输入区域
self.lbl_input = ttk.Label(self.master, text="输入字符串:", font=('微软雅黑', 10))
self.lbl_input.grid(row=0, column=0, padx=10, pady=15, sticky="w")

self.entry_input = ttk.Entry(self.master, width=30)
self.entry_input.grid(row=0, column=1, padx=10, pady=15)

# 反转按钮
self.btn_reverse = ttk.Button(self.master, text="反转字符串", command=self.reverse_string)
self.btn_reverse.grid(row=1, column=1, pady=10)

# 结果展示
self.lbl_result = ttk.Label(self.master, text="反转结果:", font=('微软雅黑', 10))
self.lbl_result.grid(row=2, column=0, padx=10, pady=15, sticky="w")

self.txt_result = tk.Text(self.master, height=2, width=25,
font=('Consolas', 10), state="disabled")
self.txt_result.grid(row=2, column=1, padx=10, pady=5)

# 清空按钮
self.btn_clear = ttk.Button(self.master, text="清空", command=self.clear_fields)
self.btn_clear.grid(row=3, column=1, pady=5)

def validate_input(self):
"""输入验证"""
input_str = self.entry_input.get().strip()
if not input_str:
messagebox.showwarning("警告", "输入不能为空!")
return False
return True

def reverse_string(self):
"""执行字符串反转"""
try:
if not self.validate_input():
return

original = self.entry_input.get()
reversed_str = original[::-1] # 使用切片实现反转

# 显示结果
self.txt_result.config(state="normal")
self.txt_result.delete(1.0, tk.END)
self.txt_result.insert(tk.END, reversed_str)
self.txt_result.config(state="disabled")

except Exception as e:
messagebox.showerror("错误", f"发生未预期错误: {str(e)}")

def clear_fields(self):
"""清空所有字段"""
self.entry_input.delete(0, tk.END)
self.txt_result.config(state="normal")
self.txt_result.delete(1.0, tk.END)
self.txt_result.config(state="disabled")


if __name__ == "__main__":
root = tk.Tk()
app = StringReverser(root)
root.mainloop()

得到base64码

1
IZIUCUSEPNGDA5K7K4YHGX3ZOAZV6NC7NM2HC4TDOBPTAZC7MFYHO3TSGB6Q====

用base64解码发现解码失败

点击展开python脚本

base64解码脚本

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import base64
import re
import os
from PIL import Image, UnidentifiedImageError


class Base64Tool:
def __init__(self, master):
self.master = master
master.title("Base64全能工具 v2.0")
master.geometry("800x600")

# 配置样式
self.style = ttk.Style()
self.style.configure('TButton', font=('微软雅黑', 10))
self.style.configure('TLabel', font=('微软雅黑', 10))

self.create_widgets()
self.setup_bindings()

def create_widgets(self):
"""创建界面组件"""
# 控制面板
control_frame = ttk.LabelFrame(self.master, text="功能控制")
control_frame.pack(pady=10, padx=10, fill=tk.X)

# 功能按钮
self.btn_encode = ttk.Button(control_frame, text="编码", command=self.encode)
self.btn_encode.grid(row=0, column=0, padx=5)

self.btn_decode = ttk.Button(control_frame, text="解码", command=self.decode)
self.btn_decode.grid(row=0, column=1, padx=5)

self.btn_img2base64 = ttk.Button(control_frame, text="图片转Base64",
command=self.image_to_base64)
self.btn_img2base64.grid(row=0, column=2, padx=5)

self.btn_base64_to_img = ttk.Button(control_frame, text="Base64转图片",
command=self.base64_to_image)
self.btn_base64_to_img.grid(row=0, column=3, padx=5)

# 设置面板
self.chk_filter = tk.BooleanVar()
self.chk_autocorrect = tk.BooleanVar()

settings_frame = ttk.LabelFrame(self.master, text="处理设置")
settings_frame.pack(pady=10, padx=10, fill=tk.X)

ttk.Checkbutton(settings_frame, text="过滤非Base64字符",
variable=self.chk_filter).grid(row=0, column=0, padx=5)
ttk.Checkbutton(settings_frame, text="自动纠错",
variable=self.chk_autocorrect).grid(row=0, column=1, padx=5)

# 输入输出区域
io_frame = ttk.Frame(self.master)
io_frame.pack(expand=True, fill=tk.BOTH, padx=10, pady=5)

self.txt_input = tk.Text(io_frame, height=15, wrap=tk.WORD,
font=('Consolas', 10))
self.txt_input.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

self.txt_output = tk.Text(io_frame, height=15, wrap=tk.WORD,
font=('Consolas', 10), state="disabled")
self.txt_output.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)

def setup_bindings(self):
"""设置事件绑定"""
self.master.bind("<Control-e>", lambda e: self.encode())
self.master.bind("<Control-d>", lambda e: self.decode())

# 核心功能实现 --------------------------------------------------
def sanitize_base64(self, data):
"""Base64数据净化处理[^1]"""
if self.chk_filter.get():
# 使用正则表达式过滤非法字符
return re.sub(r'[^A-Za-z0-9+/=]', '', data)
return data

def auto_correct(self, data):
"""自动纠错处理[^3]"""
missing_padding = len(data) % 4
if missing_padding:
data += '=' * (4 - missing_padding)
return data

def encode(self):
"""Base64编码"""
try:
input_data = self.txt_input.get("1.0", tk.END).strip()
if not input_data:
messagebox.showwarning("警告", "输入内容不能为空")
return

encoded = base64.b64encode(input_data.encode()).decode()
self._set_output(encoded)

except Exception as e:
messagebox.showerror("错误", f"编码失败: {str(e)}")

def decode(self):
"""Base64解码"""
try:
input_data = self.txt_input.get("1.0", tk.END).strip()
input_data = self.sanitize_base64(input_data)

if self.chk_autocorrect.get():
input_data = self.auto_correct(input_data)

decoded = base64.b64decode(input_data).decode()
self._set_output(decoded)

except Exception as e:
messagebox.showerror("错误", f"解码失败: {str(e)}")

def image_to_base64(self):
"""图片转Base64"""
try:
filetypes = [("图片文件", "*.png;*.jpg;*.jpeg;*.gif;*.bmp")]
path = filedialog.askopenfilename(filetypes=filetypes)

if not path:
return

with open(path, "rb") as f:
img_data = f.read()

encoded = base64.b64encode(img_data).decode()
self._set_output(encoded)
messagebox.showinfo("成功", f"已编码 {os.path.basename(path)}")

except Exception as e:
messagebox.showerror("错误", f"图片编码失败: {str(e)}")

def base64_to_image(self):
"""Base64转图片"""
try:
input_data = self.txt_input.get("1.0", tk.END).strip()
input_data = self.sanitize_base64(input_data)

if self.chk_autocorrect.get():
input_data = self.auto_correct(input_data)

img_data = base64.b64decode(input_data)

# 验证图片有效性
Image.open(io.BytesIO(img_data)).verify()

save_path = filedialog.asksaveasfilename(
defaultextension=".png",
filetypes=[("PNG 文件", "*.png"), ("JPEG 文件", "*.jpg"), ("所有文件", "*.*")]
)

if save_path:
with open(save_path, "wb") as f:
f.write(img_data)
messagebox.showinfo("成功", f"图片已保存到 {save_path}")

except UnidentifiedImageError:
messagebox.showerror("错误", "无效的图片数据")
except Exception as e:
messagebox.showerror("错误", f"图片解码失败: {str(e)}")

def _set_output(self, text):
"""更新输出框内容"""
self.txt_output.config(state="normal")
self.txt_output.delete(1.0, tk.END)
self.txt_output.insert(tk.END, text)
self.txt_output.config(state="disabled")


if __name__ == "__main__":
root = tk.Tk()
app = Base64Tool(root)
root.mainloop()

我们在用base32解码发现成功了

点击展开python脚本

base32解码脚本

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import tkinter as tk
from tkinter import messagebox, scrolledtext
import base64


def base32_encode(data: bytes) -> str:
"""Base32编码函数"""
return base64.b32encode(data).decode('utf-8').upper()


def base32_decode(encoded_str: str) -> bytes:
"""Base32解码函数"""
return base64.b32decode(encoded_str.upper())


def on_encode():
"""处理编码操作"""
input_text = entry.get("1.0", tk.END).strip()
if not input_text:
messagebox.showwarning("警告", "请输入要编码的内容")
return

try:
# 转换为字节
data = input_text.encode('utf-8')
# 进行编码
encoded = base32_encode(data)
# 显示结果
output_text.delete("1.0", tk.END)
output_text.insert(tk.END, encoded)
except Exception as e:
messagebox.showerror("错误", f"编码失败: {str(e)}")


def on_decode():
"""处理解码操作"""
input_text = entry.get("1.0", tk.END).strip()
if not input_text:
messagebox.showwarning("警告", "请输入要解码的内容")
return

try:
# 进行解码
decoded = base32_decode(input_text)
# 显示结果
output_text.delete("1.0", tk.END)
output_text.insert(tk.END, decoded.decode('utf-8'))
except Exception as e:
messagebox.showerror("错误", f"解码失败: {str(e)}")


def on_copy():
"""复制结果到剪贴板"""
result = output_text.get("1.0", tk.END).strip()
if result:
root.clipboard_clear()
root.clipboard_append(result)
messagebox.showinfo("成功", "结果已复制到剪贴板")


# 创建主窗口
root = tk.Tk()
root.title("Base32编码/解码工具")
root.geometry("600x400")

# 创建界面组件
main_frame = tk.Frame(root)
main_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

# 输入区域
input_frame = tk.Frame(main_frame)
input_frame.pack(pady=5, fill=tk.X)

input_label = tk.Label(input_frame, text="输入内容:")
input_label.pack(side=tk.LEFT)

entry = scrolledtext.ScrolledText(input_frame, height=5, width=50)
entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)

# 按钮区域
button_frame = tk.Frame(main_frame)
button_frame.pack(pady=5, fill=tk.X)

encode_btn = tk.Button(button_frame, text="编码 (Encode)", command=on_encode)
encode_btn.pack(side=tk.LEFT, padx=5)

decode_btn = tk.Button(button_frame, text="解码 (Decode)", command=on_decode)
decode_btn.pack(side=tk.LEFT, padx=5)

copy_btn = tk.Button(button_frame, text="复制结果", command=on_copy)
copy_btn.pack(side=tk.RIGHT, padx=5)

# 输出区域
output_frame = tk.Frame(main_frame)
output_frame.pack(pady=5, fill=tk.BOTH, expand=True)

output_label = tk.Label(output_frame, text="输出结果:")
output_label.pack()

output_text = scrolledtext.ScrolledText(output_frame, height=8, width=50)
output_text.pack(pady=5, fill=tk.BOTH, expand=True)

# 运行主循环
root.mainloop()

image-20250423120952754

得到

1
FQARD{L0u_W0s_yp3_4_k4qrcp_0d_apwnr0}

但是发现提交失败,怀疑是凯撒加密,我们枚举一下

点击展开python

凯撒爆破脚本

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import tkinter as tk
from tkinter import messagebox, scrolledtext


def caesar_decrypt(ciphertext):
"""改进版解密函数,保留原始格式"""
results = []
original = list(ciphertext)

for shift in range(26):
decrypted = original.copy()
for i, char in enumerate(original):
if char.isalpha():
base = ord('A') if char.isupper() else ord('a')
decrypted_char = chr((ord(char) - base - shift) % 26 + base)
decrypted[i] = decrypted_char

decrypted_str = ''.join(decrypted)
results.append(f"位移 {shift}: {decrypted_str}")

return "\n".join(results)


def on_decrypt():
"""处理解密操作"""
input_text = entry.get("1.0", tk.END).strip()
if not input_text:
messagebox.showwarning("警告", "请输入要解密的内容")
return

try:
# 进行解密
decrypted = caesar_decrypt(input_text)
# 显示结果
output_text.delete("1.0", tk.END)
output_text.insert(tk.END, decrypted)
except Exception as e:
messagebox.showerror("错误", f"解密失败: {str(e)}")


def on_copy():
"""复制结果到剪贴板"""
result = output_text.get("1.0", tk.END).strip()
if result:
root.clipboard_clear()
root.clipboard_append(result)
messagebox.showinfo("成功", "结果已复制到剪贴板")


# 创建主窗口
root = tk.Tk()
root.title("凯撒密码爆破工具(保留格式版)")
root.geometry("800x600")

# 创建界面组件
main_frame = tk.Frame(root)
main_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

# 输入区域
input_frame = tk.Frame(main_frame)
input_frame.pack(pady=5, fill=tk.X)

input_label = tk.Label(input_frame, text="输入密文:")
input_label.pack(side=tk.LEFT)

entry = scrolledtext.ScrolledText(input_frame, height=5, width=70)
entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)

# 按钮区域
button_frame = tk.Frame(main_frame)
button_frame.pack(pady=5, fill=tk.X)

decrypt_btn = tk.Button(button_frame, text="爆破解密(保留格式)", command=on_decrypt)
decrypt_btn.pack(side=tk.LEFT, padx=5)

copy_btn = tk.Button(button_frame, text="复制结果", command=on_copy)
copy_btn.pack(side=tk.RIGHT, padx=5)

# 输出区域
output_frame = tk.Frame(main_frame)
output_frame.pack(pady=5, fill=tk.BOTH, expand=True)

output_label = tk.Label(output_frame, text="解密结果(按位移0-25排列):")
output_label.pack()

output_text = scrolledtext.ScrolledText(output_frame, height=20, width=70)
output_text.pack(pady=5, fill=tk.BOTH, expand=True)

# 运行主循环
root.mainloop()

枚举出所有偏移结果

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
位移 0: FQARD{L0u_W0s_yp3_4_k4qrcp_0d_apwnr0}
位移 1: EPZQC{K0t_V0r_xo3_4_j4pqbo_0c_zovmq0}
位移 2: DOYPB{J0s_U0q_wn3_4_i4opan_0b_ynulp0}
位移 3: CNXOA{I0r_T0p_vm3_4_h4nozm_0a_xmtko0}
位移 4: BMWNZ{H0q_S0o_ul3_4_g4mnyl_0z_wlsjn0}
位移 5: ALVMY{G0p_R0n_tk3_4_f4lmxk_0y_vkrim0}
位移 6: ZKULX{F0o_Q0m_sj3_4_e4klwj_0x_ujqhl0}
位移 7: YJTKW{E0n_P0l_ri3_4_d4jkvi_0w_tipgk0}
位移 8: XISJV{D0m_O0k_qh3_4_c4ijuh_0v_shofj0}
位移 9: WHRIU{C0l_N0j_pg3_4_b4hitg_0u_rgnei0}
位移 10: VGQHT{B0k_M0i_of3_4_a4ghsf_0t_qfmdh0}
位移 11: UFPGS{A0j_L0h_ne3_4_z4fgre_0s_pelcg0}
位移 12: TEOFR{Z0i_K0g_md3_4_y4efqd_0r_odkbf0}
位移 13: SDNEQ{Y0h_J0f_lc3_4_x4depc_0q_ncjae0}
位移 14: RCMDP{X0g_I0e_kb3_4_w4cdob_0p_mbizd0}
位移 15: QBLCO{W0f_H0d_ja3_4_v4bcna_0o_lahyc0}
位移 16: PAKBN{V0e_G0c_iz3_4_u4abmz_0n_kzgxb0}
位移 17: OZJAM{U0d_F0b_hy3_4_t4zaly_0m_jyfwa0}
位移 18: NYIZL{T0c_E0a_gx3_4_s4yzkx_0l_ixevz0}
位移 19: MXHYK{S0b_D0z_fw3_4_r4xyjw_0k_hwduy0}
位移 20: LWGXJ{R0a_C0y_ev3_4_q4wxiv_0j_gvctx0}
位移 21: KVFWI{Q0z_B0x_du3_4_p4vwhu_0i_fubsw0}
位移 22: JUEVH{P0y_A0w_ct3_4_o4uvgt_0h_etarv0}
位移 23: ITDUG{O0x_Z0v_bs3_4_n4tufs_0g_dszqu0}
位移 24: HSCTF{N0w_Y0u_ar3_4_m4ster_0f_crypt0}
位移 25: GRBSE{M0v_X0t_zq3_4_l4rsdq_0e_bqxos0}

发现位移24带有CTF字眼,我们提交成功。

摩斯密码音频隐写

工具解密

使用像Audacity这样的音频处理软件打开文件,然后可以在音道的最上边看到一些特殊的:

  • [Audacity]

第一种

img

看起来是一个摩斯电码,短线代表 .,长线代表 -,最后摩斯电码翻译如下:

1
.... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ----- .---- ---.. ---.. --.- ..... ..--- . -.... .---- --... -.. --... ----- ----. ..--- ----. .---- ----. .---- -.-.

摩斯电码解码得到:

1
HBC925649CB0188Q52E617D70929191C

md5解密得到valar dohaeris

试了不对,又试了md5值的小写,通过了

flag:5bc925649cb0188f52e617d70929191c

第二种

短线用.表示,长线用-表示,分隔符用/

完整的

1
..-./-----/..---/----./-.../--../-..../..-./...../...../-..../.----/...--/----./././-.././-.../---.././....-/...../.-/.----/--.../...../-.../-----/--.../---../-....

Python摩斯电码解密

摩斯电码解密可以使用诸多在线网站,当然也可以用Python进行解密:

点击展开python脚本
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import tkinter as tk
from tkinter import messagebox

# 摩斯电码字典(可根据需要扩展)
MORSE_CODE_DICT = {
'.-': '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',
'-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4',
'.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9',
'.-.-.-': '.', '--..--': ',', '..--..': '?', '.----.': "'", '-.-.--': '!',
'-..-.': '/', '-.--.': '(', '-.--.-': ')', '.-...': '&', '---...': ':',
'-.-.-.': ';', '-...-': '=', '.-.-.': '+', '-....-': '-', '..--.-': '_',
'.-..-.': '"', '...-..-': '$', '.--.-.': '@', '...---...': 'SOS'
}


class MorseDecoderApp:
def __init__(self, root):
self.root = root
self.root.title("摩斯电码解密器")

# 创建界面组件
self.create_widgets()

def create_widgets(self):
# 输入标签和输入框
tk.Label(self.root, text="输入摩斯电码(用/分隔):").grid(row=0, column=0, padx=5, pady=5)
self.input_entry = tk.Entry(self.root, width=50)
self.input_entry.grid(row=0, column=1, padx=5, pady=5)

# 解密按钮
self.decode_btn = tk.Button(self.root, text="解密", command=self.decode_morse)
self.decode_btn.grid(row=1, column=0, columnspan=2, pady=10)

# 输出文本框
self.output_text = tk.Text(self.root, height=10, width=50)
self.output_text.grid(row=2, column=0, columnspan=2, padx=5, pady=5)

def decode_morse(self):
morse_input = self.input_entry.get().upper().replace(' ', '') # 移除空格并转为大写

try:
# 分割摩斯电码
morse_segments = morse_input.split('/')

# 解码每个片段
decoded_message = []
for segment in morse_segments:
if segment in MORSE_CODE_DICT:
decoded_message.append(MORSE_CODE_DICT[segment])
else:
decoded_message.append(f"[未知符号: {segment}]")

# 显示结果
result = ''.join(decoded_message)
self.output_text.delete(1.0, tk.END)
self.output_text.insert(tk.END, result)

except Exception as e:
messagebox.showerror("错误", f"解密过程中发生错误: {str(e)}")


if __name__ == "__main__":
root = tk.Tk()
app = MorseDecoderApp(root)
root.mainloop()

解密结果

1
F029BZ6F556139EEDEB8E45A175B0786

Cat_Jump

这种vmdk文件的不用进入系统里面,vmware也进不去直接扔到010edit或者其他十六进制进行搜索关键词

image-20250423144442953