论坛首页 CTF竞赛交流区 阅读主题

[原创] KCTF2502 第二题 初窥门径 WriteUp

235 浏览 2 回复
#1 楼主 2026-06-01 21:08:55
摘要:    该题定义了unsigned int dwtbl[3][9][10]三个有限位面穿行特征限制,需要找到从起始坐标到终点坐标之间有效穿梭路径;serial中每两个字符(ch,cl)在字符集cs = '0123456789abcdefghijklmnopqrstuvwxyz'中的索引计算得到位面内坐标(h,l)=(cs.index(ch)%12,cs.index(cl)%12),其由于(s,h,l)坐标中s坐标计算cs.index(cl)/12与h的原值cs.index(ch)无关,导致h的原码字符ch可以脱离l的原码字符cl所在字符段(cs每12字节长构成一个字符段)导致多解。

通过windows系统的wsl linux子系统file测试目标,32位应用。
通过readme.txt文件得到敏感字符串【success.】
用IDA加载测试目标,执行下述脚本定位到【success.】位置
通过对【success.】的交叉引用,定位到核心业务逻辑,如下,其中方框圈起的汇编代码,为strlen的实现。
伪码如下,我们随后进入【sub_701280】关于其校验业务逻辑
【sub_701280】函数开始做了简单的混淆,根进发现,其实际就是strlen功能;同时发现我们可以刚好把strlen代码进行回填,清除混淆。
执行下述IDAPython脚本进行混淆清除,实际就是将下述绿色圈起的汇编代码【mov eax,esi】(b'\x89\xf0')规整到0x701293处,并自动衔接后面的【sub eax,edx】
通过重新code分析,F5得到校验业务逻辑的伪码,如下

作者想要的基本校验业务逻辑如下(但实际存在漏洞,导致bug多解)
通过下述脚本,可得到各位面字表,如图
其中dwtbl[0][0][0]=0x2C0E和dwtbl[2][8][9]=0x1FB2,就是我们的起、始坐标如何获取三个位面各个坐标点是否可通行?这里我们直接调用原函数rt=sub_7011C0(dwtbl[s][h][l],&a,&b)获取270个坐标字dwtbl[s][h][l]对应的rt表、a表、b表;


登录后可查看完整内容

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288099.htm
#2 2026-06-01 21:08:55
nb。

最后于 2025-8-18 14:25
被zZhouQing编辑

,原因: 太震撼了
#3 2026-06-01 21:08:55
大哥很强

请登录后参与讨论

立即登录 注册账号