CTF下的AI安全

#网络安全#CTF

[[*CTF 2022]Alice's warm up - NSSCTF](https://www.nssctf.cn/problem/2230)

“欢迎参加XCTF-*CTF2022,我是Alice,对AI安全很感兴趣。在你们享受那些纯粹的AI安全挑战之前,我准备了一个简单的热身题。就像人类一样,AI在运行之前也需要热身。你能在这些初始化的参数中发现什么异常吗?”

hint.py

import string

assert len(flag)==16

assert flagset=string.printable[0:36]+"*CTF{ALIZE}"

assert 是 Python 里的断言语句,意思是:“我断定这个条件一定为真,如果为假,程序立刻报错停止说明flag的长度一定等于16

  • string.printable:这是 Python 标准库 string 模块里的一个字符串常量,包含了 100 个可打印字符:
  • 数字:0123456789(10个)
  • 大写字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ(26个)
  • 小写字母:abcdefghijklmnopqrstuvwxyz(26个)
  • 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`(32个)
  • 空格和制表符等(6个)
  • string.printable[0:36]:取前 36 个字符,也就是:
  • 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ(10个数字 + 26个大写字母)
  • + "*CTF{ALIZE}":在末尾拼接上 *CTF{ALIZE}。

所以 flagset 实际上就是:

text

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*CTF{ALIZE}

总共 36 + 10 = 46 个字符。

  • assert flagset == ...:断言 flagset 必须等于这个字符串。

思路

  • data/0 2209 个浮点数 = 47×47 矩阵路
  • 找 == 1.0 的位置 每行恰好有一个 1.0
  • 翻译为路径 0->0, 1->1, ..., *->C->T->F->{->A->L->I->Z->E->}->}
  • 理解目标 找从 * 到 } 的长度为 16 的路径
  • DFS 搜索 在 47 个节点中找路径
  • 得到 Flag *CTF{qx1jukznmr}

EXP路径:C:\Users\lenovo\Desktop\CTFAI安全\archive