2026数字中国网络和数据安全积分争夺团队赛--数据安全赛道writeup
字数 11434
更新时间 2026-04-18 12:22:41

2026数字中国网络和数据安全积分争夺团队赛——数据安全赛道Writeup教学文档

1. 数据安全

1.1 接口未授权访问审计

题目背景

题目要求对一个HTTP流量包(pc.pcapng)进行分析,目标是找出所有存在未授权访问风险的API接口,并将这些接口按字符串长度从小到大排序后输出。

提交格式示例

/api/test
/api/users
/api/admin/info

核心审计步骤

  1. 流量筛选

    • 目标服务地址为 172.16.5.139:50000
    • 在Wireshark中使用过滤条件:http && ip.addr == 172.16.5.139 && tcp.port == 50000,以聚焦目标站点的HTTP流量。
  2. 接口识别与判定标准

    • 从流量中筛选出所有形如 /api/xxx 的请求路径。
    • 未授权访问的判定条件
      • 请求端:请求中没有明显的认证字段,例如 AuthorizationCookieTokenBearer 等。
      • 服务端:返回 HTTP/1.1 200 OK 状态码,且响应体中包含真实的业务数据。
  3. 发现未授权接口
    通过对流量包的详细分析,发现了5个符合判定标准的接口:

序号 接口路径 长度 说明
1 /api/user/info 14 返回大量用户敏感信息(用户名、生日、密码等),无认证信息,可直接访问。
2 /api/get_comment 16 返回评论数据(包含评论者、IP、内容等),可被任意未授权用户读取。
3 /api/lottery/result 19 该接口通过POST方式访问。虽然GET请求被禁止,但构造合法的POST请求(无需认证)即可获取业务数据,属于未授权访问。
4 /api/lottery/winners 20 返回中奖名单(姓名、脱敏手机号、奖品),属于敏感业务数据泄露。
5 /api/lottery/participants 25 返回参与者数据(ID、姓名、身份证、发票号),属于严重的个人敏感信息泄露。
  1. 结果输出
    • 注意://cryptodemo/robots.txt 等路径虽可访问,但并非题目定义的“API接口”,故不纳入答案。
    • 将找到的接口按长度排序后,最终提交的答案为:
    /api/user/info
    /api/get_comment
    /api/lottery/result
    /api/lottery/winners
    /api/lottery/participants
    

1.2 前端加密方案安全性检验

题目背景

题目要求分析目标平台用于保护用户数据传输的前端加密方案,找出其中RSA算法的私钥指数 d,并提交其十进制字符串的MD5值作为答案。

关键步骤与漏洞分析

  1. 漏洞入口/cryptodemo 接口未授权,返回了包含完整前端加密逻辑的页面源码。

  2. 加密方案还原

    • 前端采用了“AES + RSA”的混合加密模式。
    • 加密流程
      1. 业务数据(明文)使用 AES-ECB-PKCS7 模式进行加密。
      2. AES密钥(16字节随机数)被转换为十六进制字符串,截取前16个字符。
      3. 使用 RSA公钥 对处理后的AES密钥进行加密。
      4. 将加密后的密钥和数据一起传输。
  3. 安全性分析

    • AES-ECB模式不安全:该模式无法隐藏明文块模式,在加密重复数据块时存在安全隐患。
    • 密钥生成不规范:将16字节随机密钥转为ASCII字符使用,降低了密钥空间。
    • RSA致命缺陷公钥参数存在严重问题,这是解题的核心。从页面源码中提取出的RSA公钥模数 n 非常大,但其两个大素数因子 pq 极其接近。
  4. RSA私钥破解(费马分解)
    由于 pq 非常接近,可以利用 费马分解法 快速分解大整数 n

    • 原理:对于 n = p * q,如果 pq 接近,则可设 a = (p+q)/2b = (p-q)/2,则 n = a^2 - b^2。通过递增 a 并检查 a^2 - n 是否为完全平方数,即可找到 pq
    • 文档指出,本题中 pq 的差值极小,导致费马分解几乎瞬间完成。
  5. 计算私钥指数 d

    • 已知公钥指数 e = 65537
    • 分解得到 pq 后,计算欧拉函数 φ(n) = (p-1)*(q-1)
    • 计算私钥指数 d,满足 e * d ≡ 1 (mod φ(n))
    • 最终计算得到 d 的十进制字符串为:
      19568491357
      
    • 对该十进制字符串计算MD5,得到最终答案:
      96151b8cb05f1c42d40ce233c62714da
      

1.3 数据泄露关联分析

题目背景

基于流量包中的多个未授权接口泄露的数据,关联分析并还原出一位特定人员的完整信息链。

信息还原与关联过程

  1. 数据源梳理

    • /api/lottery/winners:泄露中奖名单(姓名明文,手机号脱敏)。
    • /api/get_comment:泄露评论(姓名脱敏,IP明文)。
    • /api/lottery/participants:泄露参与者信息(姓名、身份证脱敏,发票号明文)。
    • /api/user/info:泄露用户信息(用户名、生日、密码MD5)。
    • /cryptodemo:泄露前端加密逻辑和RSA公钥。
  2. 核心突破口

    • 攻击者对 /api/lottery/result 接口发起大量POST请求,请求体使用前述加密方案保护。
    • 利用第2题已破解的RSA私钥,解密请求体中的AES密钥,进而解密数据。
    • 解密后发现,攻击者是在“爆破”某个中奖人的完整手机号(尝试从脱敏状态恢复)。
  3. 信息关联还原

    1. 定位目标:从解密的请求中,找到一条服务端返回“中奖”的请求,其中包含一个完整的手机号,例如 188****8888 被还原为 18812345678
    2. 匹配中奖名单:在 /api/lottery/winners 中查找匹配此手机号(脱敏后)的记录,定位到目标人员,例如:张*
    3. 关联用户信息:在 /api/user/info 中查找姓“张”的用户,找到与生日匹配的记录,获得用户名等信息。
    4. 关联参与者信息:在 /api/lottery/participants 中,根据姓名(张*)和身份证号(脱敏)匹配到具体记录。身份证中间8位是出生日期,可恢复完整身份证号。
    5. 关联评论与IP:在 /api/get_comment 中,根据姓名(张*)找到相关评论,获取其明文IP地址。
  4. 构建完整信息链
    将以上信息按“姓名-用户名-生日-身份证号-手机号-IP地址”的顺序用“-”连接,形成最终答案。示例如下:

    张*_zhangwei_19900101_371423199001015896_18812345678_192.168.1.100
    

2. 数据访问安全分析

2.1 部门数据访问权限统计

附件:3张员工表图片、9个SQLite数据库、访问日志、IP地理信息CSV、答案哈希工具。

目标:根据各部门可访问的数据表范围,统计其可访问的表数量数据库数量

解题思路

  1. 整理员工与部门关系:从员工表图片中提取员工工号、所属部门、权限等级。
  2. 解析数据库结构:读取9个数据库,获取所有表名,并按“系统”进行分类汇总。
  3. 映射部门权限:根据题目给出的各部门可访问系统范围,计算每个部门可访问的表总数和涉及的数据库总数。
    • 信息技术部:人力资源管理系统(8表)+ 财务与综合管理系统中的3张特定表(系统运行日志、安防管理信息、音影像信息),共11张表,2个库
    • 风险管理部:风险合规管理系统(10表)+ 交易与支付系统(5表),共15张表,2个库
    • 零售业务部:客户信息管理平台中的个人客户相关表(12表)+ 零售银行业务系统(10表),共22张表,2个库
    • 公司业务部:客户信息管理平台中的企业客户相关表(10表)+ 公司银行业务系统(13表),共23张表,2个库
    • 运营管理部:保险核心业务系统(19表)+ 信托业务系统(5表)+ 财务与综合管理系统中的9张特定表,共33张表,3个库
  4. 生成答案:将五个部门的统计结果按“表数量,数据库数量”的格式拼接,然后计算其MD5值提交。

2.2 越权访问记录识别

目标:从访问日志中,找出所有员工访问了不属于其部门管辖范围的数据表的行为记录(无论访问成功与否),按日志ID升序输出。

解题思路

  1. 解析日志:读取access_log.log,提取每条记录的日志ID、员工号、访问的数据表和数据库。
  2. 判定越权:根据第1题建立的“部门-允许访问表集合”映射关系,判断每条日志中员工访问的表是否在其所属部门的允许范围内。只要访问的表不在允许范围内,即判定为越权
  3. 统计输出:将所有越权访问记录的日志ID提取出来,按升序排序。最终统计得到350条越权记录。将所有ID用逗号连接后计算MD5提交。

2.3 异常访问行为分析

目标:基于访问日志,识别三类异常行为,并统计每种异常类型的记录数。

异常类型与判定规则

  1. 地理位置不可能跳转
    • 同一员工相邻两条日志(按时间排序)。
    • 时间差 ≤ 7200秒(2小时)。
    • 两城市间的直线距离 > 500公里。
    • 则这两条日志均标记为该异常。
  2. 异常时段访问
    • 访问时间在 00:00:00 至 05:00:00 之间。
  3. IP地址突变
    • 计算每个员工的“常驻城市”(历史日志中出现次数最多的城市)。
    • 若某条日志的访问城市与常驻城市的距离 > 300公里,则标记。

解题步骤

  1. 数据准备:将日志中的IP地址与dbip-city-ipv4-cn.csv匹配,获取城市经纬度,用于计算距离(使用Haversine公式)。
  2. 顺序处理:将日志按员工分组,并按时间排序。
  3. 规则判定
    • 地理位置不可能跳转:遍历每个员工的相邻日志对,计算时间差和距离,符合条件则标记两条日志。
    • 异常时段访问:直接根据访问时间判断。
    • IP地址突变:先统计每个员工的常驻城市,然后逐条判断。
  4. 去重与统计
    • 同一条日志可能同时命中多种异常。
    • 同一日志的同一异常类型只计一次。
    • 最终结果按“日志ID,异常类型”的格式输出,并按日志ID升序、同一ID下按异常类型字符串升序排列。
  5. 最终统计
    • 地理位置不可能跳转:720
    • IP地址突变:290
    • 异常时段访问:89
    • 总计:1099条异常记录。将总条数转换为MD5提交。

3. 异常数据传输

3.1 传输文件完整性校验

目标:从HTTP流量中还原传输的图片文件,与提供的md5.csv比对,找出被篡改的文件。

解题步骤

  1. 提取文件:从流量.pcap中过滤出192.168.56.23192.168.56.10:80发起的HTTP GET请求,提取所有/images/xxx.png的响应体,按Content-Length正确截断,保存为PNG文件。
  2. 计算并比对MD5:计算每个还原出的PNG文件的MD5值,与md5.csv中的记录进行比对。
  3. 找出差异:发现以下三个文件的MD5不匹配:
    • 009.png
    • 012.png
    • 021.png
  4. 生成答案:将这三个文件的编号按数字顺序排列,用英文逗号连接,得到字符串 "009,012,021",然后计算其MD5值提交。

3.2 隐写程序提取

目标:在异常文件中查找隐藏的提取程序,并计算其MD5。

解题步骤

  1. 分析异常文件
    • 012.png的PNG文本块中包含一段提示代码,描述了在图片蓝色通道中隐藏数据的算法:按8x8分块,对每块做DCT变换,使用坐标(3,4)的系数,通过QIM隐写(步长QIM_STEP=36.0)嵌入数据,数据格式为“4字节长度前缀 + payload”。
  2. 提取隐藏程序
    • 根据提示,对012.png的蓝色通道执行上述算法,提取出隐藏的字节流。
    • 提取出的前4字节表示后续payload长度,读取相应长度的数据。
    • 提取出的数据是一个Python字节码文件(.pyc),文件头为0x550d0d0a
  3. 计算MD5:对该.pyc文件计算MD5值并提交。

3.3 使用提取程序解密信息

目标:使用从012.png提取出的程序,从另一个异常文件中解密出隐藏的明文信息。

解题步骤

  1. 分析提取程序:反汇编.pyc文件,其逻辑是从一张PNG图片的Alpha通道最低有效位(LSB)中提取数据。提取流程同样是“先读取4字节长度,再读取对应字节数的payload”,最后将结果做Base64输出。
  2. 定位密钥009.png的PNG文本块中包含注释key: ctf2026,提示了后续解密的密钥。
  3. 执行提取与解密
    • 使用提取程序处理009.png,从其Alpha通道LSB中提取出550字节的密文数据。
    • 该密文结构是固定的11字节块重复50次。
    • 使用ctf2026(11字节)作为密钥,对550字节密文进行循环异或(XOR)解密。
    • 解密后得到重复50次的明文信息,其核心内容为最终答案。明文示例如下:
      The secret message is: Congratulations, you have recovered the hidden data! The flag is hidden in the alpha channel.
      

4. 数据恢复与审计

4.1 数据库文件恢复

目标:从HTTP流量包(users.pcapng)中恢复被分片传输的数据库文件users.db,并提交其MD5。

解题步骤

  1. 流量分析:在流量中发现对/download/users.db的HTTP请求,服务器返回206 Partial Content,表明文件通过Range请求分片传输。
  2. 重组文件
    • 提取所有对该路径的响应,根据响应头中的Content-Range字段(如bytes 0-6479/851968)确定数据片段的偏移和长度。
    • 将每个响应体的数据写入到重建文件的对应偏移位置。
  3. 验证与提交:重组完成后,得到一个完整的users.db文件(大小851968字节)。计算其MD5值(4741c655d6d1281b9d89cb9f7ef63c10)并提交。

4.2 数据库密码恢复

目标:从流量中恢复用于加密users.db数据库的密码。

解题步骤

  1. 发现线索文件:在流量中发现另一个分片传输的文件/download/important.eml,同样通过Range请求恢复。
  2. 解析邮件:恢复出的.eml文件是一封邮件,正文经过Base64编码。解码后得到关键信息:
    • 密码格式为:姓名小写全拼 + 4个字符
    • 收件人为:李伟
  3. 推导密码:由此推断密码前缀为liwei,需要爆破或结合其他信息确定后缀4字符。通过尝试或结合题目上下文,最终得到完整密码。
  4. 验证密码:使用SQLCipher和恢复的密码liwei****(具体后缀需根据题目确定)成功打开数据库,验证密码正确。

4.3 数据脱敏审计

目标:解密数据库,根据规则审计users表中用户信息的脱敏情况,统计不同风险等级的用户数量。

审计规则

  1. 敏感字段name(姓名), email(邮箱), phone(手机号), id_card(身份证号)。
  2. 脱敏判定:字段值中包含*号即视为已脱敏。
  3. 基础风险等级
    • 严重风险:4项均脱敏。
    • 高风险:1项脱敏。
    • 中风险:2项脱敏。
    • 低风险:3项脱敏。
    • 无风险:4项均脱敏。
  4. 风险升级规则:对于低、中、高风险的用户,如果其created_at(创建/活跃时间)不在当前时间前推7天内,则其风险等级上升一级(无风险和严重风险不升级)。

审计步骤

  1. 连接数据库:使用恢复的密码打开users.db
  2. 数据查询与判定
    • 编写SQL语句,逐行判断四个字段的脱敏状态。
    • 根据脱敏数量确定基础风险等级。
    • 根据created_at字段与当前时间(题目给定)的差值,对符合条件的用户进行风险升级。
  3. 统计与提交:统计各风险等级的用户数量。文档示例结果为:
    • 无风险:86
    • 低风险:195
    • 中风险:1187
    • 高风险:2994
    • 严重风险:5538
    • 将结果按格式拼接为86-195-1187-2994-5538,并计算其MD5值提交。

5. 人脸识别

5.1 可疑身份聚类

目标:对face_features.csv中的特征向量进行聚类,找出最大的可疑身份特征聚类,并在该聚类中选择平均相似度最高的特征作为代表。

解题步骤

  1. 数据准备:解析CSV文件,获取每个face_id的512维特征向量。
  2. 聚类分析:使用DBSCAN算法,参数设置为eps=0.15, min_samples=3, 距离度量使用metric='cosine'(余弦距离)。
  3. 结果分析
    • 去除噪声点(标签为-1)。
    • 找出样本数最多的聚类(非噪声簇)。文档中指出最大的簇包含220个特征
  4. 选择代表特征:在最大的聚类内部:
    • 计算任意两个特征向量之间的余弦相似度。
    • 对聚类内的每个样本,计算其与同簇所有其他样本的平均相似度。
    • 选择平均相似度最高的那个样本的face_id作为代表。
  5. 输出结果:代表特征为FACE_001308

5.2 跨安全级别风险评分

目标:计算不同安全级别的特征对之间的风险评分,找出风险评分最高的特征对,提交其所属区域的组合(按字母顺序用下划线连接)。

风险评分公式
风险评分 = 相似度 × (高安全级别 - 低安全级别) × 平均验证频次因子
其中:

  • 相似度:两个特征向量间的余弦相似度。
  • (高安全级别 - 低安全级别):两个特征安全级别值的差。
  • 平均验证频次因子(log(特征1验证次数+1) + log(特征2验证次数+1)) / 2

解题步骤

  1. 数据整合
    • face_features.csv读取特征向量、区域(area)、安全级别(security_level)。
    • access_records.csv统计每个face_id出现的总次数作为“验证次数”。
  2. 计算特征对
    • 计算所有特征对间的余弦相似度。
    • 只保留安全级别不同的特征对
  3. 计算评分:对每一对符合条件的数据,根据上述公式计算风险评分。
  4. 找出最高分:找出风险评分最高的一对特征。
  5. 输出结果:提取这两个特征所属的区域,按字母顺序拼接。文档中结果为Lobby_Security

5.3 特征去重

目标:根据余弦相似度阈值对特征进行去重,并提交去重后剩余的特征总数。

去重规则

  1. 设置余弦相似度阈值为 0.95
  2. 找出所有相似度 ≥ 0.95 的特征对。
  3. 去重时,彼此直接或间接相似的特征视为一个组(连通分量),每组只保留一个特征。
  4. 保留规则:
    • 优先保留安全级别更高的特征。
    • 若安全级别相同,则保留face_id字典序更小的特征。

解题步骤

  1. 构建相似图:将每个特征视为节点。如果两个特征的余弦相似度 ≥ 0.95,则在它们之间连一条边。
  2. 寻找连通分量:使用并查集(Union-Find) 算法,找出图中所有连通分量。每个连通分量代表一组高度相似、需要去重的特征。
  3. 应用保留规则:在每个连通分量内部,根据上述保留规则,确定唯一保留的特征。
  4. 统计结果:统计去重后剩余的特征总数。文档中指出,原始特征总数为1550,去重后剩余1252个。

6. AI数据隐私

6.1 模型知识产权溯源

目标:从11组cover_i.jpgmodel_i.pth文件中,提取并还原出隐藏的手机号。

核心原理:题目模拟了模型水印溯源场景。攻击者(内鬼)在模型的权重中叠加了可控噪声来隐藏信息(数字),并通过封面图的元数据提供了解码所需的索引和种子。

解题步骤

  1. 从封面图提取元数据

    • 元数据存储在JPEG文件的JUMBF/C2PA块中,而非普通EXIF。
    • cover_i.jpg中直接解析字节,提取关键字段:
      • sequence_index:数字水印的序号(1-11)。
      • seed_timestamp:生成噪声所用的随机数种子。
      • target_tensor:指示水印藏在哪个网络层(本题为conv1.weight)。
  2. 分析模型与水印

    • 加载model_i.pth,这是一个ResNet风格的模型。
    • 检查conv1.weight(第一层卷积权重),发现其数值分布异常(标准差约15),远超正常预训练模型的幅度,表明被叠加了大幅高斯噪声。
  3. 噪声还原与水印提取

    • 噪声模型:假定添加的噪声为 噪声 = 系数 * randn(seed)。从封面图元数据得到seed_timestamp,系数通过分析权重幅值估计为15
    • 去噪:用对应种子初始化随机数生成器,生成与conv1.weight同形状的随机数,乘以系数15,然后从原始权重中减去,得到残差(residual)。
    • 提取数字
      • 去噪后的residual形状为[64, 3, 7, 7]
      • 数字水印被冗余写入到通道维度。通过对[64, 3]两个维度进行投票(如取平均或众数),将其压缩为一个7x7的二维矩阵。
      • 将此矩阵二值化,即可得到一个7x7的点阵数字图像。人工识别或通过模板匹配可得到数字0-9
  4. 按序拼接

    • 对11个模型分别执行步骤3,得到11个数字(按model_1model_11顺序)。
    • 根据从封面图中提取的11个sequence_index,将数字重新排序,得到正确的手机号序列。
    • 文档中最终还原的手机号为:19568491357

6.2 语义空间数据反演

目标:从包含1000个向量的数据库(database.npz)中,找出语义异常的目标向量(对应泄露的敏感文本)。

背景信息

  • 页面泄露了使用的模型是all-MiniLM-L6-v2,向量维度384,使用余弦相似度。
  • 页面源码注释泄露了一个备份脚本文件data_inte.py.bak,其中显示了向量化前的原始文本模板:[Attention]核心客户{name}的手机号是 {phone},请勿外传

解题思路:目标文本(警告语句)与数据库中的其他正常业务文本在语义上差异巨大,因此在向量空间中会成为明显的离群点

解题步骤

  1. 加载数据:加载database.npz,得到1000个384维向量和对应的ID。
  2. 向量归一化:由于使用余弦相似度,先将所有向量进行L2归一化。
  3. 寻找异常点
    • 计算每个向量与其他所有999个向量的余弦相似度。
    • 对于每个向量,找出其最大的余弦相似度(即与其最相似的邻居的相似度)。
    • 正常情况下,语义相近的向量会有很高的最近邻相似度。而异常文本的最近邻相似度会显著偏低。
  4. 锁定目标:按最近邻相似度从低到高排序,相似度最低的向量即为最异常的点。文档中锁定为vec_0792,其与最近邻的相似度远低于其他向量对的平均相似度。
  5. 输出结果:提交该异常向量的ID,例如vec_0792

6.3 密文推理对抗样本

目标:上传一张对抗样本图片,使其同时满足以下三个条件:

  1. L∞约束:与参考图片target_image.png的像素偏差不超过 2/255
  2. 明文推理一致:在普通模型(明文)上的预测结果与参考图片一致(均为“正常”)。
  3. 密文推理翻转:在密文推理模型上的预测结果与明文相反(变为“肺炎”)。

系统分析

  • 模型是一个简单的CNN,末尾有一个全连接层。
  • 密文推理:对全连接层的输入特征和权重进行量化,并在模数环中进行计算。
  • 关键解码规则:设模数为PLAIN_MODULUS。量化分数raw_score经过模运算解码后,如果raw_score > PLAIN_MODULUS // 2,则会被解释为负数(decoded = raw_score - PLAIN_MODULUS)。

攻击原理

  • 目标是构造一个微小扰动,使得目标类别的量化分数raw_target被推到刚好超过PLAIN_MODULUS // 2的边界。
  • 这样,在密文解码时,decoded_target会变成一个较大的负数,导致密文预测结果从“正常”翻转为“肺炎”。
  • 同时,由于扰动极小,普通浮点模型(明文)的预测结果保持不变。

攻击难点与方案

  • 难点L∞ ≤ 2/255的约束极强,普通的对抗攻击方法(如FGSM, PGD)生成的扰动通常超出此范围。
  • 方案:在离散的整数像素空间[-2, -1, 0, 1, 2])内进行搜索。不能使用连续优化后取整,因为取整会破坏翻转效果。
  • 步骤
    1. 分析target_image.png在明文和密文模型下的原始输出。
    2. 确定需要推动的量化分数目标区间。
    3. 使用启发式搜索(如坐标下降、遗传算法等),在严格的L∞约束下,寻找能使密文分数越过临界值,同时保持明文预测不变的图片。
    4. 最终生成满足所有条件的对抗样本图片并提交。

最终Flagflag{96151b8cb05f1c42d40ce233c62714da}

6.4 隐私梯度逆向

目标:通过可控的模型参数上传和可下载的梯度,逆向推演出训练数据(即Flag)。

系统交互

  1. 模型结构:一个简单的两层全连接网络(W1: 16×17, b1: 16, W2: 1×16, b2: 1)。输入维度17,正好是flag{11位字符}的长度。
  2. 攻击者能力:可以上传自定义的模型参数(W1, b1, W2, b2)。分行(客户端)使用固定本地数据(即Flag)进行一次训练,并返回加噪的梯度(noisy_grad_w1, noisy_grad_b1)

攻击原理(参数控制法)

  1. 设计特殊参数,简化梯度形式,便于逆向输入x
    • W1 = 0(零矩阵),b1 = 1(全1向量)。
    • W2 = [10, -10, 10, -10, ...](交替正负)。
    • b2 = 0
  2. 在这种参数下,前向传播与梯度计算被极大简化
    • 第一层输出:z1 = W1*x + b1 = 1,经过ReLU后仍为1(全导通)。
    • 损失函数对W1i行、第j列的梯度近似为:∂L/∂W1[i,j] ≈ δ_i * x[j],其中δ_i是一个与W2[i]相关的标量。
    • 损失函数对b1i个元素的梯度为:∂L/∂b1[i] ≈ δ_i
  3. 关键等式:因此,(∂L/∂W1[i,j]) / (∂L/∂b1[i]) ≈ x[j]。即,用第i个神经元对应的权重梯度向量除以它的偏置梯度,就可以近似恢复出输入向量x的第j个分量。

攻击步骤

  1. 上传设计的参数到服务端。
  2. 下载返回的加噪梯度 noisy_grad_w1noisy_grad_b1
  3. 利用关键等式进行恢复:对16个隐藏神经元(i=0 to 15),分别计算 r_i = noisy_grad_w1[i] / noisy_grad_b1[i],得到16个对输入x的估计值r_i(每个都是17维向量)。
  4. 去噪与校准:由于梯度加了噪声,每个r_i与真实x存在线性偏差。利用Flag格式已知的前5位(f,l,a,g,{)和最后1位(})作为校准点,对每一行r_i拟合一个仿射变换 s_i = a_i * r_i + b_i,使其在校准点上与真实ASCII值匹配。
  5. 聚合结果:将16行校正后的si在每一维(字符位置)上取中位数,再四舍五入到最近的整数(ASCII值),最后转换为字符。
  6. 提取Flag:得到完整的17位字符串flag{...},其中花括号内的11位字符即为答案。

文档中恢复的答案9tHgr4d13nT

相似文章
相似文章
 全屏