数信杯北区半决赛WP
想写一首LoveSong 发表于 山东 CTF 548浏览 · 2024-09-29 11:37

Misc

字2.0

论文题,从网上一搜就行,找到stegosaurus chinese text论文即可

我用的Steganography in Chinese text | Semantic Scholar
Steganography in Chinese text | Request PDF (researchgate.net)

之后让GPT读论文,自己手动复制出来文本,想让GPT写OCR有问题

text = """
我与父親不相见已二年余了,我最不能忘記的是他的背影。那年冬天,祖
母死了,父亲的差使也交卸了,正是禍不单行的日子,我从北京到徐州,
打算跟着父親奔丧回家。到徐州見着父亲,看见滿院狼藉的东西,又想起
祖母,不禁簌簌地流下眼泪。父亲說,「事已如此,不必难過,好在天无
绝人之路!」
 回家變卖典質,父亲還了亏空;又借钱辦了丧事。這些日子,家中光
景很是惨淡,一半为了丧事,一半爲了父亲賦闲。丧事完毕,父親要到南
京谋事,我也要回北京念书,我們便同行。
 到南京时,有朋友约去游逛,勾留了一日;第二日上午便須渡江到浦
口,下午上車北去。父亲因为事忙,本已说定不送我,叫旅館里一個熟识
的茶房陪我同去。他再三囑咐茶房,甚是仔细。但他終于不放心,怕茶房
不妥帖;颇躊躇了一會。其实我那年已二十岁,北京已来往過兩三次,是
没有甚么要紧的了。他躊躇了一会,終于決定還是自己送我去。我两三回
劝他不必去;他只说,「不要緊,他们去不好!”
 我們过了江,進了车站。我买票,他忙着照看行李。行李太多了,得
向腳夫行些小費,才可过去。他便又忙着和他们讲價錢。我那时真是聪明
过分,總觉他說话不大漂亮,非自己插嘴不可。但他终於講定了价钱;就
送我上车。他給我揀定了靠车门的一张椅子;我將他給我做的紫毛大衣铺
好坐位。他嘱我路上小心,夜里警醒些,不要受涼。又嘱託茶房好好照应
我。我心里暗笑他的迂;他们只認得錢,托他们直是白托!而且我這样大
年紀的人,難道还不能料理自己麼?唉,我现在想想,那时真是太聰明
了!
 我說道,“爸爸,你走吧。」他望車外看了看,说,“我买幾個橘子
去。你就在此地,不要走动。”我看那邊月臺的栅栏外有几個賣东西的等
着顧客。走到那边月臺,须穿过鐵道,須跳下去又爬上去。父亲是一个胖
子,走过去自然要費事些。我本來要去的,他不肯,只好让他去。我看见
他戴着黑布小帽,穿着黑布大马褂,深青布棉袍,蹣跚地走到铁道边,慢
慢探身下去,尚不大難。可是他穿過鐵道,要爬上那边月台,就不容易
了。他用两手攀着上面,兩脚再向上缩;他肥胖的身子向左微傾,显出努
力的樣子。這时我看见他的背影,我的泪很快地流下來了。我趕紧拭干了
泪,怕他看見,也怕別人看见。我再向外看时,他已抱了朱红的橘子望回
走了。過铁道时,他先將橘子散放在地上,自己慢慢爬下,再抱起橘子
走。到這邊时,我赶紧去攙他。他和我走到车上,将橘子一股腦兒放在我
的皮大衣上。於是扑扑衣上的泥土,心里很輕松似的,过一會说,「我走
了;到那邊来信!”我望着他走出去。他走了几步,回過頭看见我,
说,「进去吧,裏边没人。」等他的背影混入来來往往的人裏,再找不着
了,我便進来坐下,我的眼泪又来了。
 近幾年來,父亲和我都是东奔西走,家中光景是一日不如一日。他少
年出外謀生,獨力支持,做了许多大事。那知老境却如此颓唐!他觸目伤
懷,自然情不能自已。情郁于中,自然要发之於外;家庭琐屑便往往觸他
之怒。他待我渐渐不同往日。但最近兩年的不見,他终於忘却我的不好,
只是惦記着我,惦记着我的儿子。我北來後,他写了一信给我,信中说
道,「我身体平安,惟膀子疼痛利害,舉箸提笔,诸多不便,大约大去之
期不遠矣。”我读到此处,在晶瑩的泪光中,又看見那肥胖的,青布棉
袍,黑布马褂的背影。唉!我不知何时再能与他相见!
"""

import zhconv

# 同义词字典,根据论文的思路,每个同义词组代表2个bit的信息
synonym_dict = [
    ["好", "优", "佳"],  # 同义词组,表示2 bit信息
    ["快", "迅速", "敏捷"],  # 同义词组,表示2 bit信息
    ["大", "巨大", "庞大"]  # 同义词组,表示2 bit信息
]


def from_binary(binary_str):
    """将二进制字符串转换为文本"""
    chars = [binary_str[i:i + 8] for i in range(0, len(binary_str), 8)]
    return ''.join(chr(int(char, 2)) for char in chars)


def find_synonym_group(word, synonym_dict):
    """查找词所属的同义词组"""
    for group in synonym_dict:
        if word in group:
            return group
    return None


def extract_stego_message(stego_text, synonym_dict):
    """
    从隐写文本中提取隐藏的二进制信息
    1. 繁简体转换检测
    2. 同义词替换提取信息
    """
    carrier_chars = list(stego_text)  # 将隐写文本逐字符拆分
    binary_message = ''
    count = 0  # 用来记录简体字的计数,配合繁简体嵌入策略

    # 遍历每个字符
    for char in carrier_chars:
        if zhconv.convert(char, 'zh-hans') != char:  # 检测繁体字
            # 遇到繁体字,提取信息
            binary_message += format(count, '02b')  # 使用之前的策略,繁体字隐含信息
            count = 0  # 计数器重置
        elif zhconv.convert(char, 'zh-hant') != char:  # 检测简体字
            count += 1  # 简体字,继续计数,用于嵌入信息

    # 同义词替换部分,根据词组提取隐藏的比特信息
    sentences = stego_text.split("。")  # 将文本拆分成句子

    for sentence in sentences:
        words = sentence.split()  # 分词处理句子
        for word in words:
            synonym_group = find_synonym_group(word, synonym_dict)
            if synonym_group:
                # 找到同义词组,提取该词在组中的索引位置
                index = synonym_group.index(word)
                binary_message += format(index, '02b')  # 每个同义词组携带2个bit信息

    # 将提取出的二进制信息转换为原始文本信息
    return from_binary(binary_message)



# 提取隐藏信息
extracted_message = extract_stego_message(text, synonym_dict)
print("解密后的信息:", extracted_message)

Pixel

下载附件一个png,

开头提示CBC 4MS=>SM4

下面有密文data

之后修改文件头,发现是LSB

得到key

之后找iv

zsteg发现有hex,猜测iv

ez_sign

下载附件爆破一下密码

123456

得到3个附件

第一个图片就是第一段flag

第二段流量

找到system(check)

第三段

把zip直接xor

信息收集表

直接提交邮件就可以

水印攻击_北区

添加噪声到单个像素,为整幅图像添加噪声,调整图像亮度,调整图像对比度,应用高斯模糊滤镜,处理图像的主函数,然后直接写脚本
from PIL import Image, ImageFilter, ImageEnhance
import random

def add_noise_to_pixel(pixel, noise_level=2):
    """对单个像素添加噪声"""
    rand = random.randint(-noise_level, noise_level)
    r, g, b = pixel
    return (max(0, min(255, r + rand)),
            max(0, min(255, g + rand)),
            max(0, min(255, b + rand)))

def add_noise(image, noise_level=2):
    """为整幅图像添加轻微噪声"""
    pixels = image.load()
    width, height = image.size
    for x in range(width):
        for y in range(height):
            pixels[x, y] = add_noise_to_pixel(pixels[x, y], noise_level)
    return image

def adjust_brightness(image, brightness=1.02):
    """调整图像亮度"""
    enhancer = ImageEnhance.Brightness(image)
    return enhancer.enhance(brightness)

def adjust_contrast(image, contrast=1.02):
    """调整图像对比度"""
    enhancer = ImageEnhance.Contrast(image)
    return enhancer.enhance(contrast)

def apply_blur(image, radius=0.5):
    """为图像应用高斯模糊"""
    return image.filter(ImageFilter.GaussianBlur(radius))

def process_image(input_path, output_path):
    """执行图像处理操作并保存结果"""
    # 打开图像
    image = Image.open(input_path)
    # 执行一系列处理操作
    image = add_noise(image)
    image = adjust_brightness(image)
    image = adjust_contrast(image)
    image = apply_blur(image)
    # 保存处理后的图像
    image.save(output_path, "PNG")

# 使用示例
if __name__ == "__main__":
    process_image('input.png', 'result.png')

签到寄语

还以为是web

其实就是随便说几个话,拿到gift.png

利用Releases · sz3/cfc (github.com)

下载到手机,扫描即可

Re

easy-decode

就是一个aes,一开始以为有SMC,尝试debug找key

后来仔细看了一下,这里memmove main 0x7D0

其实就是把main函数0x7D0的数据copy下来作为key,然后再转md5

直接cyber解密即可

取证

secret_1

Rstudio直接找secret,然后uncomply6反编译即可

secret_2

逆向即可

def decode(png):
    flag = "flag{eba771fd-2b03-418f-b11a-60f1141c99ee}"
    lens = len(flag)
    with open(png, "rb") as f:
        pic_bytes = f.read()
        print(len(pic_bytes))
        output_bytes = bytearray()
        for i in range(0, len(pic_bytes)):
            output_bytes.append(pic_bytes[i] ^ ord(flag[i * 2 % lens]))

    with open("decrypted_" + png, "wb") as f:
        f.write(output_bytes)
        print(f"dec_{png}")

decode("flaggg.png")

secret_3

上面解密得到的flag.png末尾有zip,有密码,一开始考虑明文攻击
后面搞不出来,看剪切板发现有密码解密得到flag

history_1

iehistory发现有ipynb

提取出来就是flag

history_2

提取出来就是flag

0 条评论
某人
表情
可输入 255