-
-
[原创] 看雪 2023 KCTF 年度赛 第十二题 深入内核
-
发表于:
2023-10-1 04:36
9510
-
[原创] 看雪 2023 KCTF 年度赛 第十二题 深入内核
name输入KCTF,在0x452582下断点,ecx就指向正确的serial
全文完,剩下的都是一些碎碎念
用时9小时12分22秒,其中1小时吃午饭(还没吃完一血就出了,顿感事情不妙,但也瞬间没什么动力了:一血时间过短,后面在怎么做的快的基本上只能拿到一半多点的难度分,还着啥急),8小时陷入在各种无用的垃圾代码和虚假代码中找不到最终的判断点在哪里(不过也顺带理了一些程序的逻辑);最后找到答案时心情五味杂陈……
解题过程没什么值得说的技术点,主要记录下心路历程和爬坑过程。
IDA打开,满屏的代码混淆,但又有一种扑面而来的熟悉感。
众所周知,看雪CTF比赛的防守方很喜欢把自己以前出过的题加些修改再重新出。再看出题战队,果然混淆方法与 看雪 2022·KCTF 春季赛 第九题 同归于尽 有明显的相似性:
大量垃圾代码+似是而非的虚假代码+隐藏控制流
区别在于,本题没有反调试。
但对于一个一向不喜欢动态调试的人来说,遇到代码混淆的题真的极度不爽。(同样是出一道题,出成无混淆的算法类型的题又小又难格局大,即使做不出来也是做题者知识面不够,更容易收获好评)
sub_40485D连同49A0E8和49A0E0两个全局变量被大量调用且有多层递归。sub_40485D在IDA中无法反编译,但在Ghidra中可以,能看到里面几乎全是对自己的递归调用,但唯有一处例外,即0x405a09处的 (**(code **)(*param_1 + 4))();
,所以能够确定这个函数只影响控制流,没有实际逻辑。
两个全局变量指向的地址附近有off_48F11C、off_48F18C、off_48F1B0三组函数指针,其中第三组是空的库函数,第二组与sub_40485D很像都是不能反编译的混淆函数,第一组则看起来正常很多(后面的分析表明,这一组确实有真实逻辑)。
全局字符串能看到48F1E8的"Success, GoodJob!"以及48F208的"error",交叉引用对应到sub_41F227和sub_438078(都在off_48F11C表里,但后面的分析表明,这两个函数虽然被调用到但里面触及这两个字符串的分支条件永远不会成立)(在此处耗费了很多时间)。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课