HGAME 打好基础
emoji表情,base100出来再丢到随波逐流得到flag
flag:hgame{L4y_a_sO11d_f0unDaTi0n}
2025春秋杯 破碎的日志
题目给了个日志文件和hmac密钥


打开日志文件看到有100条这样的日志。前128位是数据,后32位是hamc生成码
验证前面的hmac码正确,49里面flag有个不可打印字符,应该是比特位翻转
不可打印字符的二进制和10000000异或得到flag{5e7a2c4b-8f19-4d36-a203-b1c9d5f0e8a7}
2025春秋杯 大海捞针
题目给的压缩包里有大量文件,学到了一个新命令 find . -type f -exec strings -a {} \; 2>/dev/null | grep -i -B1 -A1 "flag"


得到flag{9b3d6f1a-0c48-4e52-8a97-e2b5c7f4d103}
2026VNCTF MyMnemonic
题目给了个图片,foremsot出一张黑白图片

转为01字符串
from PIL import Image
# 替换为你的图片本地路径/网络路径都可以
image_path = "1.png"
# 打开图片并转为灰度模式(黑白判断更准确)
img = Image.open(image_path).convert("L")
img_width, img_height = img.size
# 固定格子数量:横向16列、竖向12行
grid_cols = 16
grid_rows = 12
# 计算每个小格子的像素尺寸(160/16=10,120/12=10,每个格子10*10像素)
cell_width = img_width // grid_cols
cell_height = img_height // grid_rows
# 初始化空字符串,用于拼接最终的01结果
result_str = ""
for y in range(grid_rows):
for x in range(grid_cols):
# 取每个格子的中心像素(避免边缘误差)
center_x = x * cell_width + cell_width // 2
center_y = y * cell_height + cell_height // 2
# 获取灰度值(0=纯黑,255=纯白)
pixel_val = img.getpixel((center_x, center_y))
# 黑白判定:灰度<128为黑(1),否则为白(0),直接拼接到字符串
result_str += "1" if pixel_val < 128 else "0"
# 直接输出最终的纯01连续字符串
print(result_str)
这是bip39的协议构成

得到的字符串就是192位,计算6位校验和
import hashlib
def calculate_bip39_checksum_192(binary_str):
"""
计算192位二进制数据的BIP39 6位校验和
:param binary_str: 192位二进制字符串(可带空格,会自动去除)
:return: 6位二进制校验和字符串(纯0/1,固定6位)
"""
# 步骤1:预处理输入,去除所有空格
clean_bin = binary_str.replace(" ", "").strip()
# 步骤2:校验输入合法性(必须192位、仅含0/1)
if len(clean_bin) != 192:
raise ValueError(f"输入二进制长度错误,要求192位,实际输入{len(clean_bin)}位")
if not all(c in "01" for c in clean_bin):
raise ValueError("输入包含非0/1字符,仅支持二进制数据")
# 步骤3:将192位二进制转为24字节的字节串(192/8=24,BIP39的熵值字节数)
# 先转十进制整数,再转24字节大端序字节串
entropy_int = int(clean_bin, 2)
entropy_bytes = entropy_int.to_bytes(length=24, byteorder="big", signed=False)
# 步骤4:计算字节串的SHA-256哈希(BIP39核心规则)
sha256_hash = hashlib.sha256(entropy_bytes).digest() # digest()返回32字节哈希原数据
# 步骤5:取哈希结果第一个字节的**前6位**作为6位校验和
# 第一个字节是8位,右移2位(8-6=2)得到前6位的整数,再补0到6位
first_byte = sha256_hash[0]
checksum_int = first_byte >> 2 # 右移2位,保留高6位
checksum_6bit = bin(checksum_int)[2:].zfill(6) # 转二进制并补前导0至6位
return checksum_6bit
# ------------------- 测试/使用示例 -------------------
if __name__ == "__main__":
# 替换成你自己的192位二进制数据(可带空格,也可纯连续01)
your_192bit_binary = "000101111010111000011110110111010011101010000101110010100111101110110110100000001001110000110110000111011001101100001110110101000010110111101110101101100001001110110001111000000111010111110100"
try:
checksum = calculate_bip39_checksum_192(your_192bit_binary)
print(f"192位二进制的BIP39 6位校验和:{checksum}")
print(f"校验和长度:{len(checksum)}位(标准6位)")
except ValueError as e:
print(f"错误:{e}")

每11位转为十进制数

在系统中找索引得到助记词 纳百福财源似水而至走大运事业如日中天 Bip39根据助记词算种子

输入种子得到flag

2020CSICTF unseen
题目给了一个音频和png。Png在stegsolve中看到key

音频是摩斯密码,解出来之后是SEARCH-SOMEWHERE-ELSE。音频应该是steghide隐写。

得到txt,里面都是tab space,是whitespace隐写,解码得到flag

DDCTFwireshark
流量包先筛选http协议,追踪http流,看到网站
搜出来发现是一个图片解密网站,应该是图片隐写,提取出三张图片。对其中一张修复宽高

得到key,在题目刚刚给的网站解密,另外两张图片一样,但字节大的可以解出密文

随波逐流解码得到

CSAW regexpire

连接服务器要求按照要求输入符合的字符串,ai写了个程序,重复提交1000获得flag
from pwn import *
import rstr
from time import sleep
r = remote('61.147.171.35', 51955)
print(bytes.decode(r.recvline()))
i = 1
while True:
question = bytes.decode(r.recvline()[:-1])
if 'Irregular' in question:
break
if 'flag' in question:
print('flag is:', question)
break
print('No.', i, ':\n', question, '\n')
answer = rstr.xeger(question)
while '\n' in answer[:-1]:
answer = rstr.xeger(question)
print(answer, '\n')
r.sendline(answer)
i += 1
sleep(0.2)

CISCN picture
题目给了个图片,在文件尾发现zilb的数据流78 9C
放到cyberchef中解出
再base64得到文件

文件头调换一下位置得到zip文件,解压需要密码,根据文件尾提示,解压密码应该是python的报错信息
解压后得到G0TE30TY[,C,X.$%&,C@Y,T5".#5%0C%"-#,Y04)&1C8Q-S,Q.49],随波逐流解码得到

Pixel-Princess
题目给了个图片,binwalk分离出来一个图片
得到pass phrase,对原图片做steghide提取得到flag
![]()
aliCTF2026 RAG-投毒挑战

系统先检测于目标问题相似的文本内容,在进行输出。先用题目给的文本上传,获取问题答案的位置

在给定的文本中搜索归义坊,定位到chunk2(不用第二个问题是因为招福寺在后文频繁出现,语义不好修改),在后面加上指示


Picture3
给的图片binwalk得到压缩包,伪加密修复得到txt
Base64隐写
# base64隐写
import base64
def get_diff(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in range(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def b64_stego_decode():
file = open("stego.txt", "rb")
x = '' # x即bin_str
lines = file.readlines()
for line in lines:
l = str(line, encoding="utf-8")
stego = l.replace('\n', '')
# print(stego)
realtext = base64.b64decode(l)
# print(realtext)
realtext = str(base64.b64encode(realtext), encoding="utf-8")
# print(realtext)
diff = get_diff(stego, realtext) # diff为隐写字串与实际字串的二进制差值
n = stego.count('=')
if diff:
x += bin(diff)[2:].zfill(n * 2)
else:
x += '0' * n * 2
i = 0
flag = ''
while i < len(x):
if int(x[i:i + 8], 2):
flag += chr(int(x[i:i + 8], 2))
i += 8
print(flag)
if __name__ == '__main__':
b64_stego_decode()


1857

被折叠的 条评论
为什么被折叠?



