摘要: 该题定义了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
[原创] KCTF2502 第二题 初窥门径 WriteUp
235 浏览
2 回复
nb。
最后于 2025-8-18 14:25
被zZhouQing编辑
,原因: 太震撼了
最后于 2025-8-18 14:25
被zZhouQing编辑
,原因: 太震撼了
大哥很强