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

[原创] KCTF2025 - 第十题 涅槃,亦是新生 一血题解(Trace/爆破)

357 浏览 0 回复
#1 楼主 2026-06-01 21:08:55
题目给了一个 exe 一个 dll,dll 并没有数字签名看起来是自己编译的,不排除有魔改的可能,我们先看 exeexe 程序本身也不小,看起来是静态打了不少库/C++运行时,然后有很多 OoooOooooOOoO 的字样应该是源码位置被抹去了,笔者逆向做得少,并不知道这是什么自动去除异常信息的工具:

但这无伤大雅,简单看下两个 TLSCallback 里看起来没有反调试,那就先直接跑起来看看,如果别的地方藏了反调试再说
在输入flag的地方断下来,随便输点什么之后一路跟到一个简易代码块分发的函数,我们在的地方是 case 0,下面还有 case 1-9;
这里花了点时间确认上面的其他函数看起来就是加载并输出的函数,其中 KCTF 2025 基本是直接输出的,但是 Flag: 则是一个一个 char 地输出,看来字符串可能并没有特别复杂的加密,只是逐个输出(后面看来打印正确与错误的字符串也是一样)。而我们一开始跟入的地方大概读了个 string 进来,(char*)(*((void*)v160+1)) + 16 的地方就是我们的输入 这里想到第四题埋头逆了好久还原逻辑的伤心事,决定先大致看一遍逻辑再决定怎么逆 这里还在想如果是大 vm 就直接不吃了,感觉 CTF 还是多来些技巧/新知识/非预期会比较快乐,做堆工作量的题那不是就和上班一样了吗(?)首先是紧随读取后面有个类似长度检测的地方:

然后下面 case 4 看起来是正确或者错误的分支,需要一个初始为零的计数器等于 42:

case 4 剩余部分输出的方式和上面输出 KCTF 2025 Flag: 的方式一样(逐个 char 输出),是 error! 和 correct!那么基本可以确定我们在看的就是程序的主体了,接着往下看可以看到一些看起来不那么复杂的校验操作,但是在着手分析前,我们在 case 9 里面找到了更有趣的地方:

这里似乎是 16 个 char 一组,逐字节检测,更耐人寻味的是,由于输入长度应该是42,这里在最后一轮会在检测完第 42 个字符之后直接跳出。
逐字节检测 + 随意终止让笔者觉得本题的输入处理或许看起来 16 字节一组,但实际上这 16 字节互不相关,也就是可以试试逐字节爆破:

好辣,就是这样,大家拜拜!KCTF 2025

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288353.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号