-
-
[原创] KCTF2023 第十二题 深入内核 writeup
-
发表于:
2023-9-29 15:47
4365
-
[原创] KCTF2023 第十二题 深入内核 writeup
前言
其实本来都没打算再看了,但是看见 Nepnep 的大哥一个小时搞定了,于是下午去实验室打算先看看题目再说做不做,然后终于做出来了,感觉运气占大多数,也有出题人题目设置的时候考虑不周的几个点。如果能把这些地方给修复一下,这题我大概就不那么容易做出来了。
解题步骤
其实拿到题目丢 IDA 一看,发现这个庞大的函数体就开始打算放弃了。伪代码 800 行并且看起来上了混淆似的,读起来非常的吃力,不给我们还是可以先搜一下字符串看看能不能找到关键代码:
emmm,函数体太大了甚至没办法显示代码 CGI 了。反编译以后的代码更是寄中寄,过于庞大以至于不太能在短时间内阅读了。
于是抱着几乎放弃的划水心态搜了一下加密特征:
看起来还行,虽然这种识别的特征经常会出错,不过倒是可以跟一下看看。
一个是 base64 编码函数,跟了一下输入,似乎总是会给一个字符串的样子:
出题人没加反调试,所以接下来的这些操作基本上不怎么受阻,单说做题的观感还是十分舒服的。
然后编码的结果是:OEQ5N0Y4ODI4NDlBODA4NDgwOTI4RTg2RjE5MkY3ODJGMkU0OUJGNDg1OTI4MEY1
暂时还不知道这个字符串有啥作用,继续给 md5 的几个函数也下个断点:
在这里下了断点跟过来以后就发现,第二个参数就是刚刚经过 base64 的结果,这里做了个 md5 编码后得到:47a62c6eb8a72031a27b89abc3d976f7
这个东西正好就跟我们输入的序列号一样了!?
然后题目就突然变得非常简单了,因为我可以忽略掉一些代码混淆,直接在这里拦截加密的结果,直接就能拿出答案了。
不妨用 KCTF 作为用户名试试看:
序列号可以就直接用题目给的,然后我们直接来到调用 md5 加密的部分:
函数 sub_FF4429
是一个 tohex 的操作,返回的 v5 变量就是最终加密的结果了,直接拿下:
其实我最开始还没意识到能够直接去这样搞。我还试图去跟踪了一下那个 base64 的入参,结果也是一些字符串。其中有一个固定的 aczbjhaskjlasb123456
,另外还有一个似乎每次启动都会随机性的生成不同的数据。
但是考虑到不管这个随机数据生成了什么,最后和用户名做了运算都要有唯一结果,因此 base64 的结果应该和用户名是一一对应的,然后后续的操作就都明确了,简单上个 md5 就出了。
总结
题目的保护强度其实还是很高的,但是出题人在设计的时候因为以下两个问题导致题目的总体难度严重下滑了:
- 没有对一些算法特征做隐藏,这导致我直接确定出了特定函数的功能,并通过断点直接跟出了代码逻辑,而省略掉了分析过程
- 程序会主动根据用户名计算密文,这导致选手能够直接使用程序本身的代码加密而不再需要自己分析代码的功能和逻辑了。
这几个问题加起来,就导致我在做题的时候根本不需要关系出题人前面设计的大量混淆是如何对程序进行保护的了。或许出题人就是这么打算的?感觉好像也说得通,如果选手对原理感兴趣可以自行深入,而不感兴趣的选手则点到为止?
注:没加反调试在我心里是给好评的
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)