首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
逆向工程
发新帖
1
0
[分享][原创][SWPUCTF 2025 秋季新生赛]CodeRunner
发表于: 2026-8-7 14:42
302
[分享][原创][SWPUCTF 2025 秋季新生赛]CodeRunner
git_82469cjj123-cjj
2026-8-7 14:42
302
# ### [SWPUCTF 2025 秋季新生赛]CodeRunner 做这道题的时候我一直在网上找wp,根本没有 个人感觉超级难,一开始打开是这样的 !<a href="elink@504K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5P5h3&6#2P5s2c8K6k6h3y4Q4x3X3g2X3k6h3W2K6K9s2g2Q4x3X3g2U0L8W2)9J5c8Y4y4H3j5h3y4W2i4K6u0r3j5i4m8A6i4K6u0r3j5X3!0^5i4K6u0r3M7%4c8J5k6h3q4E0i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6S2M7%4W2F1j5$3y4G2k6r3g2Q4x3V1k6Q4x3@1k6U0L8$3c8W2i4K6y4p5e0f1c8U0x3p5&6i4h3X3#2a6c8@1k6B7e0#2N6K9L8p5&6s2e0e0m8z5g2@1f1I4e0g2N6d9L8f1&6s2h3e0q4k6K9V1@1#2e0U0u0g2x3q4W2f1L8r3k6U0x3o6l9@1j5g2g2@1d9@1#2E0c8V1S2d9L8X3S2o6f1g2S2h3b7W2u0q4L8q4g2T1K9@1A6G2j5e0l9&6y4r3t1K6L8K6u0d9d9q4A6y4e0U0m8@1k6W2k6s2z5i4u0K9g2K6b7$3f1U0m8V1y4W2x3J5d9V1k6V1c8W2A6u0j5Y4A6r3x3q4x3H3e0U0c8V1K9$3S2n7g2o6u0z5g2g2c8F1k6K6q4T1L8q4u0D9h3s2A6q4x3@1!0p5h3i4N6z5P5W2W2^5e0Y4A6C8y4V1#2f1j5K6c8z5K9V1p5K6e0#2c8U0x3@1!0h3z5g2N6z5b7g2)9J5y4X3q4V1k6q4)9#2k6Y4N6S2N6r3g2J5L8h3q4J5K9#2)9K6c8s2c8J5N6h3g2Q4x3U0k6K6j5$3g2F1k6g2)9#2k6Y4c8&6M7r3g2Q4x3@1c8o6b7@1@1`.">img</a> 运行之后发现脚底下是一个二维码,但是看不到全貌,这道题的提示说扫码就可以得到flag,是不是非常简单,实则不然,所以我想应该只有两种可能,一种是生成二维码,一种是二维码已经在了,所以我打算拆包,使用AssetStudio,但是没有找到二维码,但是找到了和黑块和白块,以及QRCodeBuilder函数,所以基本断定应该是制作二维码 !<a href="elink@3b1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5P5h3&6#2P5s2c8K6k6h3y4Q4x3X3g2X3k6h3W2K6K9s2g2Q4x3X3g2U0L8W2)9J5c8Y4y4H3j5h3y4W2i4K6u0r3j5i4m8A6i4K6u0r3j5X3!0^5i4K6u0r3M7%4c8J5k6h3q4E0i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6S2M7%4W2F1j5$3y4G2k6r3g2Q4x3V1k6Q4x3@1k6U0L8$3c8W2i4K6y4p5e0X3A6y4P5p5&6p5h3i4S2y4K9W2V1K6e0Y4A6k6P5q4A6s2d9i4W2z5K9W2p5J5h3W2N6c8x3f1#2f1h3i4W2y4g2p5W2%4e0#2N6K9L8g2A6f1f1X3k6d9x3s2m8a6f1g2f1^5P5r3c8t1b7W2g2i4L8X3I4c8j5$3A6c8N6$3u0j5M7s2N6W2c8V1A6J5g2#2N6v1c8W2A6q4K9q4y4k6x3p5A6I4g2r3I4v1k6W2k6s2z5i4u0K9g2K6b7$3f1W2k6V1N6$3u0i4d9V1A6f1x3i4m8%4j5Y4A6k6N6#2y4f1g2U0c8K9d9q4u0j5f1h3#2y4x3W2A6C8k6o6m8T1K9V1&6B7h3s2A6q4x3@1!0p5h3i4N6z5P5W2W2^5e0Y4A6C8y4V1#2f1j5K6c8z5K9V1p5K6e0#2c8U0x3@1!0h3z5g2N6z5b7g2)9J5y4X3q4V1k6q4)9#2k6Y4N6S2N6r3g2J5L8h3q4J5K9#2)9K6c8s2c8J5N6h3g2Q4x3U0k6K6j5$3g2F1k6g2)9#2k6Y4c8&6M7r3g2Q4x3@1c8o6b7@1@1`.">img</a> 后面我想使用 Il2CppDumper 来找找结构信息,看看能不能对解题产生什么帮助,但是这一步报错了,是没有其中一个文件,但是是有的,所以才发现是壳,蜕壳之后成功取得结构信息 !<a href="elink@538K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5P5h3&6#2P5s2c8K6k6h3y4Q4x3X3g2X3k6h3W2K6K9s2g2Q4x3X3g2U0L8W2)9J5c8Y4y4H3j5h3y4W2i4K6u0r3j5i4m8A6i4K6u0r3j5X3!0^5i4K6u0r3M7%4c8J5k6h3q4E0i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6S2M7%4W2F1j5$3y4G2k6r3g2Q4x3V1k6Q4x3@1k6U0L8$3c8W2i4K6y4p5e0#2N6u0y4f1^5J5h3e0g2a6c8r3D9@1e0e0u0c8P5W2W2f1j5%4A6y4g2p5u0B7h3V1c8V1L8f1!0f1h3i4N6k6K9X3c8B7e0i4A6c8P5V1&6*7f1X3k6f1x3U0W2h3j5V1g2z5b7W2V1H3f1i4W2c8P5W2p5K6j5U0u0z5P5X3b7K6L8r3S2W2g2$3c8n7f1g2N6@1g2W2N6F1h3Y4c8T1K9X3I4k6g2U0y4Z5k6W2k6s2z5i4u0K9g2K6b7$3f1K6t1#2N6@1#2i4d9U0c8k6x3s2m8S2j5U0q4D9y4W2k6j5f1U0c8V1d9p5A6J5f1W2N6y4x3g2p5K6K9s2u0T1K9%4m8F1h3s2A6q4x3@1!0p5h3i4N6z5P5W2W2^5e0Y4A6C8y4V1#2f1j5K6c8z5K9V1p5K6e0#2c8U0x3@1!0h3z5g2N6z5b7g2)9J5y4X3q4V1k6q4)9#2k6Y4N6S2N6r3g2J5L8h3q4J5K9#2)9K6c8s2c8J5N6h3g2Q4x3U0k6K6j5$3g2F1k6g2)9#2k6Y4c8&6M7r3g2Q4x3@1c8o6b7@1@1`.">img</a> 把结构信息中的Assembly-CSharp.dll拉入ILSpy,找到QRCodeBuilder类,发现伪造的 DLL 是空壳,但拿到了函数的真实内存地址,将脱壳后的 `GameAssembly.dll` 拖入 IDA Pro。利用快捷键 `G` 跳至 `ConstructQRCode` 方法。按 `F5` 反编译后,发现这里只有“按图纸铺地砖”的双重 `for` 循环逻辑,通过读取 `*(a1 + 72)`(即 `qrMatrix`)来判断放黑块还是白块 跳入 `QRCodeBuilder` 的构造函数(`.ctor`),终于看到了决定性代码 ```Plain v8[0] = 29; v8[1] = 29; // 创建 29x29 的矩阵 (Version 3 二维码) sub_181652960(v9, qword_182F726A8, 0); // 从内存深处拷贝数据 ``` 在 IDA 的 `.data` 段追踪 `182F726A8`,发现那里的数据是 `80000003h`。这并不是真实数据,而是 IL2CPP 引擎的 Metadata Token。它指向了存放在 `global-metadata.dat` 中的一串二进制死数据 既然我们知道数据在 `global-metadata.dat` 里,且二维码大小是 $$29 \times 2$$,那干脆不按常理出牌,直接祭出 CTF 的终极奥义:**特征码****扫描**。 所有二维码的左上角都有一个 7x7 的定位方块(黑黑黑黑黑黑黑白)。在 int 数组中,这就意味着必然存在连续的 7 个 1 和 1 个 0。 编写 Python 脚本,直接在 `global-metadata.dat` 里进行地毯式爆破: ```Python import os from PIL import Image def find_and_draw(): filepath = "global-metadata.dat" # 二维码左上角特征:连续 7 个黑块(1) 和 1 个白块(0) # 扫描模式 A:int 数组 (4字节 Little Endian) pattern_int = (b'\x01\x00\x00\x00' * 7) + b'\x00\x00\x00\x00' print(f"[*] 正在扫描 {filepath} ...") with open(filepath, "rb") as f: data = f.read() offset = 0 while True: offset = data.find(pattern_int, offset) if offset == -1: break # 截取 29x29 = 3364 字节 chunk = data[offset : offset + 3364] # 校验:确保这 3364 字节全是 0 或 1 if len(chunk) == 3364 and all(chunk[i:i+4] in (b'\x00\x00\x00\x00', b'\x01\x00\x00\x00') for i in range(0, 3364, 4)): print(f"[+] 在偏移 {hex(offset)} 处成功捕获矩阵!") # 画图还原 width, height = 29, 29 img = Image.new('1', (width, height), 1) pixels = img.load() for y in range(height): for x in range(width): val = chunk[(y * width + x) * 4] if val == 1: pixels[x, y] = 0 # 1 代表黑块 img = img.resize((290, 290), Image.NEAREST) img.save("flag_qrcode.png") print("[+] 二维码已生成!") return offset += 1 if __name__ == "__main__": find_and_draw() ```
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
收藏
・
1
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
git_82469cjj123-cjj
1
发帖
0
回帖
0
RANK
关注
私信
他的文章
[分享][原创][SWPUCTF 2025 秋季新生赛]CodeRunner
302
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部