2025羊城杯初赛Misc-writeup

news/2025/10/13 0:01:21/文章来源:https://www.cnblogs.com/alexander17/p/19137524

别笑,你试你也过不了第二关

构造变量 hilogo 使其值等于指定的 ASCII 艺术图案,代码长度必须小于 285 字符

第一关通过尝试,发现题目存在沙箱,禁了import,print,base64等,同时禁用使用字符串格式化

我们采用Code Golf的方法一句话直接绕过

a='      #    ';b='##### ';c='  #   #';d='#   #  #';e=' #     # ';f='#####  ';g=' ###   #';h='  #####';hilogo=f+f+g+a+h+' '+b+b+f+g+a+h+'\n'+'#  '+a+d+a+c+e+a+d+a+c+'\n'+'#  '+a+f+'#'+a+c+e+a+f+'#'+a+c+'\n'+'#  '+a+d+a+c+e+a+d+a+c+'\n'+f+f+d+'####'+h+h+' '+b+b+f+d+'####'+h+h

第二关

我们使用同样的方法,进行字符串切片,异或和链式比较

'tsnrhtdd'[n%5*(n%100^15>4>n%10)::4]

可得flag

帅的被人砍

流量包中tcp流传输的data提取出来

from scapy.all import rdpcap, TCP, UDP, Rawdef extract_payloads_from_pcap(pcap_file):packets = rdpcap(pcap_file)payloads = []for pkt in packets:# 只处理包含 Raw 层(即有 payload)的包if Raw in pkt:payload = bytes(pkt[Raw])payloads.append(payload)print(f"[+] 提取到 {len(payload)} 字节数据")return payloads# 使用示例
pcap_path = r"C:\Users\Alexander\Desktop\Desktop\3.pcapng" # 替换为你的 pcap 文件路径
all_payloads = extract_payloads_from_pcap(pcap_path)# 合并所有 payload(如果数据是连续传输的)
full_data = b''.join(all_payloads)# 保存原始流量 data 部分
with open("extracted_raw_data.bin", "wb") as f:f.write(full_data)print(f"✅ 共提取 {len(full_data)} 字节的原始 data")

image

发现是个倒装的7z,我们翻转回来

image

得到一个jpg和.c代码文件

//gcc -o decryptor decryptor.c -lssl -lcrypto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/evp.h>#define HEADER_SIZE 128  // 文件头部大小void decrypt_file(const char *input_file, const char *output_file, unsigned char *key) {FILE *in = fopen(input_file, "rb");if (!in) {perror("Unable to open input file");return;}unsigned char header[HEADER_SIZE];fread(header, 1, HEADER_SIZE, in);unsigned char iv[AES_BLOCK_SIZE];fread(iv, 1, AES_BLOCK_SIZE, in);fseek(in, 0, SEEK_END);long encrypted_size = ftell(in) - HEADER_SIZE - AES_BLOCK_SIZE;fseek(in, HEADER_SIZE + AES_BLOCK_SIZE, SEEK_SET);unsigned char *encrypted_data = malloc(encrypted_size);fread(encrypted_data, 1, encrypted_size, in);fclose(in);AES_KEY decrypt_key;AES_set_decrypt_key(key, 256, &decrypt_key);unsigned char *decrypted_data = malloc(encrypted_size);AES_cbc_encrypt(encrypted_data, decrypted_data, encrypted_size, &decrypt_key, iv, AES_DECRYPT);FILE *out = fopen(output_file, "wb");if (!out) {perror("Unable to open output file");free(encrypted_data);free(decrypted_data);return;}fwrite(header, 1, HEADER_SIZE, out);fwrite(decrypted_data, 1, encrypted_size, out);fclose(out);free(encrypted_data);free(decrypted_data);
}int main() {unsigned char key[32] = {'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X','X', 'X', 'X', 'X', 'X', 'X', 'X', 'X','X', 'X', 'X', 'X', 'X', 'X', 'X', 'X','X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'};
//  Ҫ   任 ɻ õ key decrypt_file("  ̬KEY      .lock", "  ̬KEY      .re", key);system("chmod +x   ̬KEY      .re");return 0;
}

图片steghide隐写

image

PZNCKSLLLNWUMILYTNQSXCIDUNBHBDFV

但是我们单独逆向flag生成器

image

lzonc2550f12s3964f5spqornmzjfgg7

用户输入传入multipe_shift_decrypt与字符串进行对比,我们还原算法

多表凯撒。周期性移位密钥 [3, 5, 2] 对输入字符串进行还原

image

def encrypt(plain):shifts = [3,5,2]res = []for i, c in enumerate(plain):if c.isalpha():base = ord('a')shift = shifts[i % 3]enc = (ord(c) - base + shift) % 26 + baseres.append(chr(enc))else:res.append(c)return ''.join(res)print(encrypt("lzonc2550f12s3964f5spqornmzjfgg7"))
oeqqh2550i12v3964h5xrtttqrbmkij7

这是个假的key

传入程序只会回显success并不会给flag。

我们根据图片拿到32位的key我们还原aes加密过程并解密得到key.re二进制文件

from Crypto.Cipher import AES
import os# 配置
HEADER_SIZE = 128
INPUT_FILE = r"C:\Users\Alexander\Desktop\Desktop\动态KEY生成器.lock" # 替换为你的实际加密文件名
OUTPUT_FILE = "KEY.re"  # 输出文件名
KEY = b"PZNCKSLLLNWUMILYTNQSXCIDUNBHBDFV"  # 32字节密钥def decrypt_file(input_file, output_file, key):with open(input_file, "rb") as f:# 读取128字节头部header = f.read(HEADER_SIZE)if len(header) != HEADER_SIZE:raise ValueError("文件太短,无法读取头部")# 读取16字节IViv = f.read(AES.block_size)if len(iv) != AES.block_size:raise ValueError("文件太短,无法读取IV")# 读取剩余加密数据encrypted_data = f.read()# 创建AES解密器(CBC模式)cipher = AES.new(key, AES.MODE_CBC, iv)# 解密decrypted_data = cipher.decrypt(encrypted_data)# 去除PKCS#7填充(如果存在)# 注意:原始C代码没有去填充,但实际加密通常会填充# 这里安全地尝试去除填充try:pad_len = decrypted_data[-1]if isinstance(pad_len, str):pad_len = ord(pad_len)if 1 <= pad_len <= AES.block_size and all(b == pad_len for b in decrypted_data[-pad_len:]):decrypted_data = decrypted_data[:-pad_len]except Exception:# 如果不是标准填充,保留原始数据(兼容C代码行为)pass# 写入:头部 + 解密后数据with open(output_file, "wb") as f:f.write(header)f.write(decrypted_data)print(f"[+] 解密完成: {output_file}")if __name__ == "__main__":# 如果文件名包含特殊Unicode字符,请确保正确指定# 例如:INPUT_FILE = "\u0020\u032cKEY\u0020\u0020\u0020\u0020\u0020\u0020.lock"decrypt_file(INPUT_FILE, OUTPUT_FILE, KEY)# 添加可执行权限(Linux/macOS)if os.name != 'nt':os.chmod(OUTPUT_FILE, 0o755)print(f"[+] 已添加可执行权限: {OUTPUT_FILE}")

得到KEY.re二进制文件,我们逆向分析

image

image

得到key的逻辑

key.re是动态key生成器,以time为基准进行生成

image

题目说

小杜在2021年7月1日17时30分的时候使用动态密钥生成器,生成了一组KEY。而你怎样才能让FLAG生成器输出正确的flag呢。对了,他在使用动态密钥生成器的时候,被定位在了上海。

获取时间戳2021年7月1日17时30分

通过仿写key匹配去获取flag

完整的exp

import datetime# ===== 配置参数 =====
TARGET = "lzonc2550f12s3964f5spqornmzjfgg7"  # 目标 FLAG 前缀(32字符)
CENTER_EPOCH = 1625131800  # 初始猜测时间戳(2021-07-01 17:30 CST)
SEARCH_WINDOW = 3600# byte_B60 数组(65字节,实际使用前64)
BYTE_B60 = [0x5E, 0x55, 0x44, 0x42, 0x5C, 0x07, 0x04, 0x0D,0x07, 0x51, 0x01, 0x0B, 0x42, 0x01, 0x0E, 0x00,0x05, 0x58, 0x00, 0x4B, 0x46, 0x41, 0x45, 0x4C,0x46, 0x4A, 0x52, 0x54, 0x5F, 0x5B, 0x5D, 0x01,0x76, 0x76, 0x60, 0x75, 0x6D, 0x7D, 0x4A, 0x57,0x5C, 0x49, 0x53, 0x09, 0x07, 0x07, 0x04, 0x55,0x5E, 0x40, 0x41, 0x46, 0x40, 0x59, 0x53, 0x48,0x02, 0x01, 0x09, 0x0E, 0x02, 0x50, 0x05, 0x4B,0x00
]# 移位规则(用于还原 FLAG)
SHIFTS = [3, 5, 2]def generate_dynamic_key(t: int) -> str:"""根据时间戳 t 生成 64 字符动态 KEY"""sq = t * tsq_str = str(sq)if len(sq_str) > 16:base16 = sq_str[-16:]else:base16 = sq_str.zfill(16)# 重复4次得到64字节明文plain64 = (base16 * 4).encode('ascii')# 与 byte_B60 异或key_bytes = bytes(plain64[i] ^ BYTE_B60[i] for i in range(64))return key_bytes.decode('latin1')  # 允许非ASCII字符def reverse_shift_decrypt(s: str) -> str:"""对字符串 s 应用反向移位(用于还原 FLAG)"""result = []for i, ch in enumerate(s):if ch.isalpha():base = ord('a') if ch.islower() else ord('A')# 反向移位:减去 shift,模26shifted = (ord(ch) - base - SHIFTS[i % len(SHIFTS)]) % 26result.append(chr(shifted + base))else:result.append(ch)return ''.join(result)def main():print(f"🔍 正在搜索时间戳范围: {CENTER_EPOCH - SEARCH_WINDOW} ~ {CENTER_EPOCH + SEARCH_WINDOW}")print(f"🎯 目标 FLAG 前缀: {TARGET}\n")for t in range(CENTER_EPOCH - SEARCH_WINDOW, CENTER_EPOCH + SEARCH_WINDOW + 1):dynamic_key = generate_dynamic_key(t)decrypted_flag = reverse_shift_decrypt(dynamic_key[:32])if decrypted_flag == TARGET:# 获取可读时间(UTC 和 北京时间)dt_utc = datetime.datetime.fromtimestamp(t, tz=datetime.timezone.utc)dt_cst = dt_utc.astimezone(datetime.timezone(datetime.timedelta(hours=8)))print(f"\n🔑 原始动态 KEY (64字符):")print(repr(dynamic_key))print(f"\n🔐 AES-256 密钥 (前32字节,原始字节):")aes_key_bytes = dynamic_key[:32].encode('latin1')print("Hex: ", aes_key_bytes.hex())print("Str: ", repr(dynamic_key[:32]))print(f"\n🎯 验证 FLAG: {decrypted_flag}")returnprint(f"❌ 在 ±{SEARCH_WINDOW} 秒范围内未找到匹配。")if __name__ == "__main__":main()

image

成功男人背后的女人

图片放进010

image

有mkBT块,明显是使用adobe firework这个软件

我们打开

image

发现男生和女生图案,然后转01数据

01000100 01000001 01010011 01000011 01010100 01000110 01111011 01110111 00110000 01101101 01000101 01001110 01011111 01100010 01100101 01101000 00110001 01101110 01000100 01011111 01001101 01000101 01101110 01111101

image

得到flag

polar

cursor直接解决

题目得到

  • 使用8个比特位(信道)传输4比特信息

  • 每个信道擦除率为0.5

  • 需要每个信息比特的恢复率超过50%,并且至少2个比特恢复率>0.7

    二进制极化变换,该函数对输入向量 u 进行逐级蝶形运算,最终输出编码后的码字
    x=u⋅GN=u⋅BNF ⊗n
    采用BEC 信道极化码构造的经典方法

最终提交的exp

def polarTransform(u, N):n = int(np.log2(N))x = u.copy()for stage in range(n):stride = 2 ** (stage + 1)for start in range(0, N, stride):mid = start + stride // 2for i in range(stride // 2):a = x[start + i]b = x[mid + i]x[start + i] = (a + b) % 2x[mid + i] = breturn xdef computeChannelReliability(N, eps):if N == 1:return np.array([eps])Whalf = computeChannelReliability(N // 2, eps)Wminus = 2 * Whalf - Whalf ** 2Wplus = Whalf ** 2W = np.zeros(N)W[0::2] = WminusW[1::2] = Wplusreturn Wdef construction(N, K, eps):reliabilities = computeChannelReliability(N, eps)infoIdx = np.argsort(reliabilities)[:K]infoIdx = np.sort(infoIdx)frozenIdx = np.array([i for i in range(N) if i not in infoIdx])return infoIdx, frozenIdx, reliabilitiesdef encode(u, N):return polarTransform(u, N)def decode(y, frozenIdx):N = len(y)bestU = NonebestScore = -1for attempt in range(10):uHat = np.zeros(N, dtype=int)if attempt > 0:for i in range(N):if i not in frozenIdx:uHat[i] = np.random.randint(0, 2)for iteration in range(3):for i in range(N):if i in frozenIdx:uHat[i] = 0else:uHat[i] = findBestBit(y, uHat, i, N)xHat = polarTransform(uHat, N)score = 0for j in range(N):if y[j] is not None and xHat[j] == y[j]:score += 1if score > bestScore:bestScore = scorebestU = uHat.copy()return bestUdef findBestBit(y, uCurrent, bitIdx, N):bestScore = -1bestBit = 0for bitVal in [0, 1]:uTest = uCurrent.copy()uTest[bitIdx] = bitValxTest = polarTransform(uTest, N)score = 0for j in range(N):if y[j] is not None:if xTest[j] == y[j]:score += 1else:score -= 1if score > bestScore:bestScore = scorebestBit = bitValreturn bestBit

交互exp

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import timeHOST = "45.40.247.139"
PORT = 30832print("正在连接靶机...")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
print("✅ 连接成功!\n")# 接收欢迎消息
time.sleep(0.5)
data = s.recv(4096).decode('utf-8', errors='ignore')
print(data)# 发送选项 2
print(">>> 发送: 2")
s.send(b"2\n")
time.sleep(1)# 接收提示
data = s.recv(4096).decode('utf-8', errors='ignore')
print(data)# 读取并发送极化码
print(">>> 读取极化码...")
with open('polar_code_complete.py', 'r', encoding='utf-8') as f:polar_code = f.read()print(f">>> 发送代码 ({len(polar_code)} 字节)...")
s.send(polar_code.encode('utf-8') + b"\n")
time.sleep(0.5)# 发送 END
print(">>> 发送: END")
s.send(b"END\n")# 接收响应
print("\n等待服务器响应...\n")
print("=" * 70)for i in range(10):  # 最多等待10次time.sleep(1)try:s.settimeout(3)data = s.recv(4096).decode('utf-8', errors='ignore')if data:print(data)if 'flag' in data.lower():print("\n" + "=" * 70)print("🎉🎉🎉 成功获取 Flag! 🎉🎉🎉")print("=" * 70)breakexcept socket.timeout:continueexcept:breaks.close()
print("\n任务完成!")

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将 GPU 级性能带到企业级 Java:CUDA 集成实用指南

引言 在企业软件世界中,Java 依靠其可靠性、可移植性与丰富生态持续占据主导地位。 然而,一旦涉及高性能计算(HPC)或数据密集型作业,Java 的托管运行时与垃圾回收开销会在满足现代应用的低延迟与高吞吐需求上带来…

我的个人空间

Hero BannerMCPAPPMovie H5浏览器插件微信

2025.10.12总结

今天继续学习软考相关知识,目前过完数据结构和算法相关知识,在看操作系统,看的课程讲的云里雾里的听不懂。 目前任务 1.软考 2.继续学苍穹外卖 软考下个月就开始考试很紧急 苍穹外卖对找工作有帮助,而这仅仅是一个…

Windows 文件管理器中重复的 OneDrive 图标原因与解决方案

最近发现 Windows 文件管理器左侧出现了两个 OneDrive 图标。 检查注册表后发现,它们分别对应两个不同的命名空间(CLSID): {018D5C66-4533-4307-9B53-224DE2ED1FE6} → 系统版 OneDrive(个人) {04271989-C4D2-F…

10.12总结

1.今天啥都没干 2.明天学习组建模板

【Python】pandas的向量化操作

dict_nb={[1,2,3]:[4,5]}#多层循环效率不高 for i in range(0, df2.shape[0]): #循环,如果df2的列表中,每行第1列等于GOOD,且第4列等于字典键的第二个值(此处为2),第5列等于字典键的第三个值(此处为3)if df2.v…

docker部署doris

拉取镜像 docker pull apache/doris:fe-3.0.4 docker pull apache/doris:be-3.0.4docker-compose.yamlversion: "3" services: fe: image: apache/doris:fe-3.0.4 hostname: fe environment: - FE_SERVERS=f…

ES客户端8版本与ES服务端7版本的兼容问题

🎬 第一阶段:发现问题(认识症状) 🔴 看到的错误日志: 2025-09-30 14:23:45.123 ERROR - ES全量同步任务执行失败 co.elastic.clients.transport.TransportException: Missing [X-Elastic-Product] header. P…

AI 改变数据库产品实践探索

AI 改变数据库产品实践探索OceanBase 结合 AI 技术,通过 Agent 和任务调度简化数据库操作,支持多数据库管理与易用性提升。01 obloader agent 导数工具使用中的难题 在实际使用导数工具进行数据导入的过程中,用户普…

使用Sender和io_uring改造Webserver

前言 我以前有写过一个练手玩具,参考 tinywebserver 当然那时候我稍微改了下,改成了主从 Reactor 和 epoll 不过那时候感觉最后实现的有线程问题,查了半天没查出来红温了,索性加了一把大锁 最近读了下 Sender 模型…

乐理 -04 打拍子

.. 四N拍子 打拍子.....附点小切分 强的在中间大附点&大切分八N拍子 打拍子 3个

如何在Renpy尝试中调整人物和背景图像大小

在初步绘制好立绘或者是背景后,如果直接存入images文件中进行图像调用,往往会出现图像过于大或者是过于小,导致当前场景观感不佳等问题。 解决方案主要有两种: (1)重新选择较大或者是较小的画布,重新绘制立绘,…

开源软件站

1. OSCHINA - 中文开源技术交流社区 https://www.oschina.net/2. 开源软件 - Gitee.com3. Trending repositories on GitHub today GitHub4. Explore projects GitLab5. GitCode - 全球开发者的开源社区,开源代码托…

如何安装claude code以及ccr code

如何安装claude code以及ccr code 1. 安装 node 1.1 node的常规安装(适用于linux18.04,linux20.04等新版本) 参考官网安装顺序:https://nodejs.org/en/download 1.2 常规安装失败,其他情况下node的安装(适用于li…

代码托管平台

1. 开源软件 - Gitee.com2. Trending repositories on GitHub today GitHub3. Explore projects GitLab4. GitCode - 全球开发者的开源社区,开源代码托管平台5. 腾讯Coding 2025年10月12日停止注册,推荐CNB - Cloud…

209. 长度最小的子数组 滑动窗口+暴力

209. 长度最小的子数组 滑动窗口 思路 初始化滑动窗口的起始位置 left = 0、终止位置 right = 0。 外循环先确定滑动窗口的终止位置(增大滑动窗口),找到符合条件的子序列, 根据当前子序列元素和大小的情况,在内循…

CISA事件响应实战经验:漏洞修复与应急响应关键教训

美国网络安全和基础设施安全局分享了一起联邦机构遭攻击事件的技术分析,详细介绍了攻击者利用GeoServer漏洞的入侵过程、横向移动技术,并总结了漏洞修复、应急响应计划和日志监控三个关键教训。执行摘要 CISA在美国联…

机器人视觉系统在复杂环境中的自主决策与学习

本文介绍了某中心研发的Robin机器人视觉系统,该系统通过机器学习技术实现复杂场景下的物体识别与抓取决策,具备持续学习能力,能够从错误中自动学习并提升分拣准确率,展示了机器人感知系统在生产环境中的实际应用。…