首页
社区
课程
招聘
[原创] KCTF2502 第二题 初窥门径 WriteUp
发表于: 2025-8-17 18:47 3827

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

HHHso 活跃值
26
2025-8-17 18:47
3827

摘要:

    该题定义了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表;


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-9-2 09:53 被HHHso编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 1508
活跃值: (2036)
能力值: ( LV12,RANK:229 )
在线值:
发帖
回帖
粉丝
2

nb。

最后于 2025-8-18 14:25 被zZhouQing编辑 ,原因: 太震撼了
2025-8-18 14:19
0
雪    币: 3645
活跃值: (617)
能力值: ( LV11,RANK:186 )
在线值:
发帖
回帖
粉丝
3
大哥很强
2025-8-18 15:59
0
游客
登录 | 注册 方可回帖
返回