579. AI Village Capture the Flag @ DEFCON31 | ai-village-capture-the-flag-defcon31
这是我第一次参加CTF比赛,我真的很喜欢这次经历。为了找到许多题目的解法,我参考了往年的解题方案和论坛。
感谢作者的辛勤工作、远见和对AI社区的贡献!
我只是进行模型预测,并从分类错误的数据中找到目标群体。为了找到该群体,我统计每个分类特征中分类错误最多的值,并找出能使得分最大化的那个。数值型特征采用相同的策略。
input_data = df[(df['income'] != df['predictions']) & (df["age"] <= 38) & (df['occupation'] == "Tech-support")].id.astype(int).tolist()
感谢去年解决方案的帮助。
https://www.kaggle.com/code/cdeotte/solutions-d3fc0n-ctf-lb-0-894#HOTTERDOG-(id:-hotterdog)----400-Points
但有趣的是,我从这里找到了目标信息:

[255, 23435] = [像素值, 数量]。输出数据应有256个值,对应RGB像素值的数量。第二个提示是计数任务,因此只需找出数据集中每个像素值的常见程度。数据集可能不同,感谢这个讨论:
https://www.kaggle.com/competitions/ai-village-capture-the-flag-defcon31/discussion/449263
解决方案也来自去年,但模型是MobileNetV2:
https://pytorch.org/hub/pytorch_vision_mobilenet_v2/
但困扰了我很长时间的问题是——提交图像时应使用相同的处理方式(归一化、缩放和裁剪)。
与Granny 1的解决方案相同,但我将图像保存为jpg格式,并在多个epoch中以不同的学习率迭代更改图像以最大化得分。
我查看了之前的CTF挑战,找到了使用"<>"发送请求的策略。然后发现需要插入is_admin标签,但很难选择合适的字体和图像大小。经过多次迭代,我发现最佳识别效果是:Itrue。
img = Image.new(mode="RGB", size=(800,92), color=(255,255,255))
font = ImageFont.FreeTypeFont("ABeeZee-Regular.otf",size=36)
与去年的策略相同,但要找到第5、6、8位的字母,我们需要反转模型输出的概率(argmax(probs) -> argmin(probs)),然后我们就能在第6位找到"O"。

只需更改树懒图像的像素值。我从初始像素值中减去一些值,逐个识别出文本的各个部分。