本篇文章记载了攻防世界misc题目简单难度的1-20题解法,大家在文章里面可以直接点CTRL+F然后输入题目序号搜索,有问题可以评论博主看到会回答
比如你想找第一题极限反转那一题,就直接CTRL+F输入1241就行

0257:
题目给了一串密文

看起来大概是替换密码,我们直接去网站解密
https://www.guballa.de/substitution-solver
解密得到一串英文

flag:
flag{classical-cipher_is_not_security_hs}
0320:
题目给了两个图片

这种情况率先用stegsolve进行图片结合

得到flag
1297:
题目给了字符串

题目名称是base32,Base32 以 5 字节(1字节8位bit)为一组,编为 8 个字符(1字符5位bit),不足8字符就用=填充,数据不足 5 字节时,需在末尾补零以凑足 5 的倍数,标准规定补位必须为 0,所以我们先根据等号数量推算出原始数据的有效位数,再将 Base32 字符转为二进制串,截取有效位之后的多余位,收集后按 8 位一组还原成字符,即可得到隐藏的 flag。

注意1字节8位bit,1字符5位bit
根据图片,1字节就是8bit,补两个0bit得到两个有效字符(因为5bit一个字符),每行8个字符,所以需要补六个等号
同理2字节就是16bit,补四个bit得到4个有效字符,所以补4个等号
我们再用题目中的数据理解:
比如第一行MFZWIY3=,把每个字符换成5位二进制,即01100 00101 11001 10110 01000 11000 11011,然后是补了一个等号,根据上面的图就是4字节,48=32bit,然后因为5bit一个字符,5 7=35bit,所以提取33bit-35bit的011
同理第二行NVXD====,换成5位二进制,即01101 10101 10111 00011,补了四个等号,所以是2字节,28=16bit,4 5=20bit,所以提取17-20的0011
最后把每行提取的二进制拼起来转成ASCII码就是flag
编写脚本如下:
python
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
char_to_val = {c: i for i, c in enumerate(alphabet)}
# 等号数量 → 原始数据字节数
pad_to_bytes = {6: 1, 4: 2, 3: 3, 1: 4, 0: 5}
with open('base32.txt') as f:
lines = [l.strip() for l in f.read().strip().split('\n')]
all_hidden_bits = ''
for line in lines:
# 第1步:分离数据部分和填充等号
data_part = line.rstrip('=')
pad_count = len(line) - len(data_part)
# 第2步:由等号数量推原始数据字节数
data_bytes = pad_to_bytes[pad_count]
data_bits_count = data_bytes * 8
# 第3步:每个base32字符 → 5位二进制,拼接
bits = ''
for c in data_part:
bits += format(char_to_val[c], '05b')
# 第4步:前 data_bits_count 位是有效数据,后面的是隐藏位
hidden = bits[data_bits_count:]
print(f"{line:12s} | 隐藏位: {hidden}")
all_hidden_bits += hidden
# 第5步:每8位转一个ASCII字符
print(f"\n收集到的全部隐藏位 ({len(all_hidden_bits)}位):")
print(all_hidden_bits)
flag = ''
for i in range(0, len(all_hidden_bits), 8):
byte_bits = all_hidden_bits[i:i+8]
flag += chr(int(byte_bits, 2))
print(f"\n→ flag: {flag}")

执行后得到flag:
flag{great}
0315:
题目给了一个附件
里面是一个需要密码的压缩包,试了一下密码是压缩包的名字的数字

比如这个压缩包的密码是46783,我点了几下发现还有许多这样的镶套的文件,所以我们写个脚本(注意用我这个脚本需要在底下把初始文件名改成你下载的附件名,即:

)
python
import zipfile
import re
import os
def extract_nested_zip(start_zip):
current = start_zip
while True:
if not os.path.isfile(current):
print(f"文件不存在: {current}")
break
# 先打开压缩包,查看内部第一个文件名(假设只有一个文件)
try:
with zipfile.ZipFile(current, 'r') as zf:
file_list = zf.namelist()
if not file_list:
print("压缩包为空,停止")
break
inner_name = file_list[0] # 假设只有一个文件
print(f"内部文件: {inner_name}")
except Exception as e:
print(f"无法读取压缩包 {current}: {e}")
break
# 从内部文件名中提取数字作为密码
match = re.search(r'\d+', inner_name)
if not match:
print(f"内部文件名 {inner_name} 中无数字,无法确定密码,停止")
break
password = match.group().encode()
print(f"正在用密码 {password.decode()} 解压 {current}")
try:
with zipfile.ZipFile(current, 'r') as zf:
zf.extractall(pwd=password)
print(f"解压成功,得到文件: {inner_name}")
except Exception as e:
print(f"解压失败: {e}")
break
# 删除当前压缩包(可选)
os.remove(current)
# 下一轮处理新解压出的文件
current = inner_name
if __name__ == "__main__":
start_zip = "初你的始文件名"
extract_nested_zip(start_zip)

得到一个音频文件也是需要密码

我们尝试用John破解,依次执行以下三个命令
bash
zip2john 12475.zip>hash1.txt
bash
john hash1.txt
bash
john --show hash1.txt

得到密码为b0yzz
用audacity打开音频文件,然后切换到频谱图

得到flag:BallsRealBolls
1203:
题目给了一个文本文件和一张图片
因为是window生成的压缩包,如果有遇到解压后文件名乱码的如下图
可以用这个命令解压
7z x -mcp=936 压缩文件
这是正常的文件名:
文本文件是一大串密文

然后图片长这样

这里我改名成5.jpg,,我们先看图片,看一下有没有隐藏文件
bash
binwalk 5.jpg

没有隐藏文件,那我们看看字符串
bash
strings 5.jpg

得到一个密码:catflag
再看会那个文本文件,文件名称是我养了一只叫兔子的91岁的猫猫
考虑用rabbit解码
去网站http://www.esjson.com/rabbitEncrypt.html
解密,密钥为刚才找到的catflag

再去另一个网站http://www.hiencode.com/base91.html进行base91解码

解码得到一堆cat,即Ook编码的变式
去网站https://www.splitbrain.org/services/ook进行Ook编码,选择Ook to Text

flag为:CATCTF{Th1s_V3ry_cute_catcat!!!}
1129:
附件给了一个加密压缩文件,用7z直接解压,这个是一个伪加密
bash
7z x 141e4b5ea7edd713d213f574dcdee7ca(1).zip
得到一个打不开的图片
用010editor打开图片,

根据底下的指引提示IHDR块错误,所以我们修改文件第二行后三个字节和第三行第一个字节总共4个字节即8个十六进制数的数据,即下图的1F314983

(如果文件只读可以点左上角file然后点击save a copy,然后再打开copy的文件就可以得到一个可编辑的copy版)
修改后打开图片

看起来高度不太够,我们修改高度(宽度在第二行前四个字节,高度在第二行5-8字节

即宽度对应图中的00000280,高度对应000000C8)高度我改为00000144,修改完后还要再根据提示改变IHDR块
修改后得到

底下英文应该是一个密码,用binwalk查看隐藏文件
bash
binwalk flag1.png
用提取里面的压缩文件,命名为3.zip
bash
dd if=flag1.png of=3.zip bs=1 skip=257969
然后用刚才得到的英文作为密码解开得到

这是brainfuck编码,去上一题ook网站https://www.splitbrain.org/services/ook也有这个编码

得到莫尔斯电码
去cyberchefhttps://cyberchef.org选择from Morse code解密

再把输出改为小写得到flag:yinmidejiaoluo
1127:
题目给了一个文本文件和一张图片
因为是window生成的压缩包,如果有遇到解压后文件名乱码的如下图
可以用这个命令解压
7z x -mcp=936 压缩文件
或者用unar解压也行

这是正常的文件名:
文本文件是一大串密文

然后图片长这样

这里我改名成5.jpg,,我们先看图片,看一下有没有隐藏文件
bash
binwalk 5.jpg

没有隐藏文件,那我们看看字符串
bash
strings 5.jpg

得到一个密码:catflag
再看会那个文本文件,文件名称是我养了一只叫兔子的91岁的猫猫
考虑用rabbit解码
去网站http://www.esjson.com/rabbitEncrypt.html
解密,密钥为刚才找到的catflag

再去另一个网站http://www.hiencode.com/base91.html进行base91解码

解码得到一堆cat,即Ook编码的变式
去网站https://www.splitbrain.org/services/ook进行Ook编码,选择Ook to Text

flag为:CATCTF{Th1s_V3ry_cute_catcat!!!}
0403:
题目给的压缩包解压得到一个音频文件,用audacity打开

切换到频谱图,然后放大拉到最右边得到flag

flag:
RCTF{bmp_file_in_wav}
1113:
题目给了一张图片,关于解一道线性代数的题目,然后把解出的值变成SHA1值,这里解出来是0011011001,然后转化为SHA1值
bash
echo -n "0011011001" | sha1sum

所以flag:
XSCTF{103c8041593b4b8e38971db283a7a773b0ffc2ee}
1287
题目是base91,文件给了一串密文

但是看到最后这段密文其实是有用=号填充的,但是base91并不会用=填充,所以我们先尝试base64解码
https://cyberchef.org

一直解码直到出现@iH<,{SC)9Q)^^Jmsfn<Q*BT=!V*nPSWuDi1h}Sg#~$uF`,这里可以看到括号了,然后再用base91解码得到flag
https://www.dcode.fr/code-base-91

1241:
题目给了一张图片:

看一下有没有隐藏文件:
bash
binwalk 1.png

发现里面有一个图片,用dd提取
bash
dd if=1.png of=13.png bs=1 skip=1374534

这个如果把他调转90度有点像Data Matrix 码
bash
convert 13.png -rotate 90 13_rot90.png
调转90度输出13_rot90.png,但是我却扫描不出来
0286:
题目附件给了一个音频文件,我重命名为1
用audacity打开,然后点击分析再点绘制频谱

发现两个峰值分别在1200,2200附件,说明待会先尝试AFSK1200解码
用soxi查看详细信息
bash
soxi 1

转为标准解调模式(这题不转也行,但是建议转)
bash
sox 1 -r 22050 -c 1 -b 16 out.wav
从 WAV 文件中解码 AFSK1200 调制的信号
bash
multimon-ng -t wav -a AFSK1200 out.wav

直接得到flag
1280:
题目给了一个流量分析文件,先用binwalk扫描一下有没有隐藏文件,题目给的附件我命名为1
bash
binwalk 1

有一些隐藏文件
在wireshark点击左上角文件然后选择导出对象选ftp data

得到六个文件

其中flag和flag.zip分别有两份都是一样的,flag里面是1234567
尝试解压flag.zip需要密码,用1234567也不是密码,那我们就先解密key.log,打开wirkshark,然后点击编辑点击最下面的首选项

然后选择Protocols再拉到下面选择TLS,然后在(pro)-master-secret log filename上传key.log后点击确定
回到主页面后再点击文件导出对象选择HTTP

有个zip文件,直接保存它
解压缩后得到一个音频文件,用audacity打开,然后切换频谱图放大得到flag.zip密码:AaaAaaaAAaaaAAaaaaaaAAAAAaaaaaaa!

得到flag:
flag{4sun0_y0zora_sh0ka1h@n__#>>_<<#}
0285:
题目给了一个流量分析文件
在wireshark进行过滤
bash
frame matches "(?i).*\\.(png|jpg|jpeg|gif|bmp|pdf|zip|rar|7z|tar|gz|txt|doc|xls|ppt|key|)"

然后对第里面随便一个包追踪TCP流,直接得到flag

0340:
题目给了一个图片

用binwalk看一下有没有隐藏文件
binwalk 1

里面有一个zip文件,用dd提取
dd if=1 of=key.zip bs=1 skip=19273 count=185

里面有一个key.txt需要密码

我们再看回题目

姓名LiHua,不少于1000个字,记得署名,即尝试用四位掩码+LIHua进行暴力破解
这里我们用john进行破解
zip2john key.zip > hash.txt
john --mask='?a?a?a?aLiHua' hash.txt

得到密码15CCLiHua,打开文件得到flag

1265:
题目给了一个有密码的文件,也说了是四位密码。直接用john的掩码模式破解
zip2john 1.zip > hash.txt
john --mask='?a?a?a?a' hash.txt

里面有两个文件


试了一下里面的flag是错误的,另一个文件里面有佛曰,说明这是要用与佛论禅解密
脚本:https:// github.com/playGitboy/YuFoLunChan
这是本题代码:
python
from Crypto.Cipher import AES
from re import split
from py7zr import SevenZipFile
from io import BytesIO
KEY = b'XDXDtudou@KeyFansClub^_^Encode!!'
IV = b'Potato@Key@_@=_='
foYue = [
'滅', '苦', '婆', '娑', '耶', '陀', '跋', '多', '漫', '都', '殿', '悉', '夜', '爍', '帝', '吉',
'利', '阿', '無', '南', '那', '怛', '喝', '羯', '勝', '摩', '伽', '謹', '波', '者', '穆', '僧',
'室', '藝', '尼', '瑟', '地', '彌', '菩', '提', '蘇', '醯', '盧', '呼', '舍', '佛', '參', '沙',
'伊', '隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '迦', '他', '姪', '豆', '特', '逝',
'朋', '輸', '楞', '栗', '寫', '數', '曳', '諦', '羅', '曰', '咒', '即', '密', '若', '般', '故',
'不', '實', '真', '訶', '切', '一', '除', '能', '等', '是', '上', '明', '大', '神', '知', '三',
'藐', '耨', '得', '依', '諸', '世', '槃', '涅', '竟', '究', '想', '夢', '倒', '顛', '離', '遠',
'怖', '恐', '有', '礙', '心', '所', '以', '亦', '智', '道', '。', '集', '盡', '死', '老', '至']
BYTEMARK = ['冥', '奢', '梵', '呐', '俱', '哆', '怯', '諳', '罰', '侄', '缽', '皤']
ruShiWoWen = [
'謹', '穆', '僧', '室', '藝', '瑟', '彌', '提', '蘇', '醯', '盧', '呼', '舍', '參', '沙', '伊',
'隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '他', '姪', '豆', '特', '逝', '輸', '楞',
'栗', '寫', '數', '曳', '諦', '羅', '故', '實', '訶', '知', '三', '藐', '耨', '依', '槃', '涅',
'竟', '究', '想', '夢', '倒', '顛', '遠', '怖', '恐', '礙', '以', '亦', '智', '盡', '老', '至',
'吼', '足', '幽', '王', '告', '须', '弥', '灯', '护', '金', '刚', '游', '戏', '宝', '胜', '通',
'药', '师', '琉', '璃', '普', '功', '德', '山', '善', '住', '过', '去', '七', '未', '来', '贤',
'劫', '千', '五', '百', '万', '花', '亿', '定', '六', '方', '名', '号', '东', '月', '殿', '妙',
'尊', '树', '根', '西', '皂', '焰', '北', '清', '数', '精', '进', '首', '下', '寂', '量', '诸',
'多', '释', '迦', '牟', '尼', '勒', '阿', '閦', '陀', '中', '央', '众', '生', '在', '界', '者',
'行', '于', '及', '虚', '空', '慈', '忧', '各', '令', '安', '稳', '休', '息', '昼', '夜', '修',
'持', '心', '求', '诵', '此', '经', '能', '灭', '死', '消', '除', '毒', '害', '高', '开', '文',
'殊', '利', '凉', '如', '念', '即', '说', '曰', '帝', '毘', '真', '陵', '乾', '梭', '哈', '敬',
'禮', '奉', '祖', '先', '孝', '雙', '親', '守', '重', '師', '愛', '兄', '弟', '信', '朋', '友',
'睦', '宗', '族', '和', '鄉', '夫', '婦', '教', '孫', '時', '便', '廣', '積', '陰', '難', '濟',
'急', '恤', '孤', '憐', '貧', '創', '廟', '宇', '印', '造', '經', '捨', '藥', '施', '茶', '戒',
'殺', '放', '橋', '路', '矜', '寡', '拔', '困', '粟', '惜', '福', '排', '解', '紛', '捐', '資']
def DecryptFoYue(ciphertext):
data = b''
i = 0
while i < len(ciphertext):
if ciphertext[i] in BYTEMARK:
i = i + 1
data = data + bytes([foYue.index(ciphertext[i]) + 128])
else:
data = data + bytes([foYue.index(ciphertext[i])])
i = i + 1
cryptor = AES.new(KEY, AES.MODE_CBC, IV)
result = cryptor.decrypt(data)
flag = result[-1]
if flag < 16 and result[-flag] == flag:
result = result[:-flag]
return result.decode('utf-16le')
def DecryptRuShiWoWen(ciphertext):
data = b''
for i in ciphertext:
data += bytes([ruShiWoWen.index(i)])
cryptor = AES.new(KEY, AES.MODE_CBC, IV)
fsevenZip = SevenZipFile(BytesIO(cryptor.decrypt(data)))
zipContent = fsevenZip.readall()['default'].read()
return zipContent
if __name__ == '__main__':
try:
# 直接修改这里的foYu变量即可
# foYu = "如是我闻:名西三陵帝焰数诵诸山众參哈瑟倒陰捨劫奉惜逝定雙月奉倒放足即闍重号貧老诵夷經友利普过孕北至花令藐灯害蒙能羅福羅夢开雙禮琉德护慈積寫阿璃度戏便通故西故敬于瑟行雙知宇信在礙哈数及息闍殺陵游盧槃药諦慈灯究幽灯豆急彌貧豆親诵梭量树琉敬精者楞来西陰根五消夢众羅持造彌六师彌怖精僧璃夫薩竟祖方夢訶橋經文路困如牟憐急尼念忧戏輸教乾楞能敬告树来楞殊倒哈在紛除亿茶涅根輸持麼阿空瑟稳住濟号他方牟月息盡即来通貧竟怖如槃精老盡恤及游薩戏师毒兄宝下行普鄉释下告劫惜进施盡豆告心蒙紛信胜东蒙求帝金量礙故弟帝普劫夜利除積众老陀告沙師尊尼捨惜三依老蒙守精于排族祖在师利寫首念凉梭妙經栗穆愛憐孝粟尊醯造解住時刚槃宗解牟息在量下恐教众智焰便醯除寂想虚中顛老弥诸持山諦月真羅陵普槃下遠涅能开息灯和楞族根羅宝戒药印困求及想月涅能进至贤金難殊毘瑟六毘捨薩槃族施帝遠念众胜夜夢各万息尊薩山哈多皂诵盡药北及雙栗师幽持牟尼隸姪遠住孕寂以舍精花羅界去住勒排困多閦呼皂難于焰以栗婦愛闍多安逝告槃藐矜竟孕彌弟多者精师寡寫故璃舍各亦方特路茶豆積梭求号栗怖夷凉在顛豆胜住虚解鄉姪利琉三槃以舍劫鄉陀室普焰于鄉依朋故能劫通"
foYu = "佛曰:姪諳明罰藝缽娑曳呐勝呐實梵帝冥耨缽顛皤竟奢利娑諳藝究穆真盧諸那哆蒙夜婆菩罰闍哆舍皤栗摩罰恐朋梵迦侄伊罰老呼奢是冥滅實陀槃呐切世婆皤依多咒缽般缽耨朋"
foYu = split("[::]", foYu)
if len(foYu) > 1:
foYu = "".join(foYu[1:]).strip()
else:
foYu = foYu[0]
print(DecryptFoYue(foYu))
except:
print(DecryptRuShiWoWen(foYu))
执行脚本得到flag
python3 foyue.py

0963:
题目给了一个流量分析文件

在wireshark按CTRL+F进行过滤
选择分组字节流和字符串过滤flag
得到一个python代码

我们右键这个包选择追踪流然后选TCP

得到完整代码:
python
import string
import random
from base64 import b64encode, b64decode
FLAG = 'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'
enc_ciphers = ['rot13', 'b64e', 'caesar']
# dec_ciphers = ['rot13', 'b64d', 'caesard']
def rot13(s):
_rot13 = string.maketrans(
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
return string.translate(s, _rot13)
def b64e(s):
return b64encode(s)
def caesar(plaintext, shift=3):
alphabet = string.ascii_lowercase
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)
def encode(pt, cnt=50):
tmp = '2{}'.format(b64encode(pt))
for cnt in xrange(cnt):
c = random.choice(enc_ciphers)
i = enc_ciphers.index(c) + 1
_tmp = globals()[c](tmp)
tmp = '{}{}'.format(i, _tmp)
return tmp
if __name__ == '__main__':
print encode(FLAG, cnt=?)
密文太长了就不列出来了,加密方法就是对随机用凯撒或base64或ROT13进行合计加密50次
我们编写脚本破解
python
import base64
import string
def rot13(s):
"""ROT13 解码"""
return s.translate(str.maketrans(
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm"))
def b64d(s):
"""Base64 解码"""
return base64.b64decode(s).decode('utf-8')
def caesar_dec(s, shift=3):
"""凯撒解密(只对小写字母移位)"""
alphabet = string.ascii_lowercase
shifted = alphabet[-shift:] + alphabet[:-shift]
table = str.maketrans(alphabet, shifted)
return s.translate(table)
def recursive_decode(data):
"""递归解码"""
while data and data[0] in '123':
code = data[0]
rest = data[1:]
if code == '1':
data = rot13(rest)
elif code == '2':
data = b64d(rest)
else: # '3'
data = caesar_dec(rest)
return data
# 给定的加密字符串
encrypted = "这里填写密文"
# 递归解码
flag = recursive_decode(encrypted)
print(flag)
运行:
得到flag:flag{li0ns_and_tig3rs_4nd_b34rs_0h_mi}
1091:凯撒大帝在培根里藏了什么
题目给了一个密文

那顾名思义就是用培根密码和凯撒密码解密,用cyberchef解密培根密码

再用脚本解密凯撒密码
"""
python
import string
def caesar_encrypt(plaintext, shift):
"""加密:将每个字母向后移动 shift 位"""
result = []
shift = shift % 26
for ch in plaintext:
if ch.isupper():
result.append(chr((ord(ch) - ord('A') + shift) % 26 + ord('A')))
elif ch.islower():
result.append(chr((ord(ch) - ord('a') + shift) % 26 + ord('a')))
else:
result.append(ch)
return ''.join(result)
def caesar_decrypt(ciphertext, shift):
"""解密:将每个字母向前移动 shift 位"""
return caesar_encrypt(ciphertext, -shift)
def caesar_bruteforce(ciphertext):
"""暴力破解:输出所有 25 种可能的结果"""
print("尝试所有移位(1-25):")
for shift in range(1, 26):
decrypted = caesar_decrypt(ciphertext, shift)
print(f"Shift {shift:2}: {decrypted}")
def main():
print("="*40)
print("凯撒密码工具")
print("="*40)
mode = input("请选择模式 (1:加密, 2:解密, 3:暴力破解): ").strip()
if mode == '1':
plain = input("请输入明文: ")
try:
shift = int(input("请输入移位 (整数): "))
except:
print("移位必须是整数!")
return
cipher = caesar_encrypt(plain, shift)
print(f"加密结果: {cipher}")
elif mode == '2':
cipher = input("请输入密文: ")
try:
shift = int(input("请输入移位 (整数): "))
except:
print("移位必须是整数!")
return
plain = caesar_decrypt(cipher, shift)
print(f"解密结果: {plain}")
elif mode == '3':
cipher = input("请输入密文: ")
caesar_bruteforce(cipher)
else:
print("无效选择")
if __name__ == "__main__":
main()

在shift6得到flag:HAVEFUNWITHCRYPTO
0249:题目给了一张图片我命名为1

看一下有没有隐藏文件
bash
binwalk 1

看来没有
用stegsolve打开图片,使用extract data功能

504B0304是zip文件开头,所以点击save bin保存文件,我这里保存为1.zip,然后解压后用010editor打开,CTRL+F搜索hctf即可得到flag

hctf{scxdc3tok3yb0ard4g41n~~~}
0171:

字母a-f夹杂着数字,用16进制解码试试看

得到flag
flag{hello_world}