ctf misc学习之旅week8

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值