很惭愧,这篇题解写的并不是很好,因为我平时刷题的题解都是做题笔记,并不像比赛上交的题解那样直入主题,做破解的时候肯定要尝试猜测,会走很多弯路,比赛题解不会记载这些弯路,而做题笔记会.
这样的笔记更能让读者了解到我到底是怎么做的,这也是我入门期期望能读到的东西. 直接向答案去的题解虽然能看懂,但是只是授之以鱼, 很难让我积累太多经验,当然,复现的时候也是经验的积累
为什么说这篇题解写的不好呢,因为走的弯路实在是有点多,把无效的分析当重点,最后才发现题的核心部分只有短短一段,而且很好识别,如果早些采用这个路线,这道题早就做出来了.但是我还是把它发出来了,希望各位师傅看到其中的缺点也能加以指导吧.
这是一道核心加密为XXTEA,并且加了大量混淆的普通加密逆向, 废话就说到这儿,下面上做题过程
这题的名字叫SoMuchCode, 先来欣赏一下main的长度
这是把最上面放大了的,可以看到跳转也不是特别清晰,跳来跳去的.
但是还是那句话,我们在做题而不是实战, 既然是题,它就是为了我们能做出来而生的. 类似这种超长的,难以人力分析的, 无非两种情况:有固定模式或规律/用自动化解题脚本.
否则大概只有刚学C++的新手才会把一个main写这么长吧(((
通过IDA的图, 我们把这个大概分成几段结构相似/相同的代码,一一去分析
首先是这部分:
这三个黄框里的代码块结构大体相似,我们先分析上面独立的代码块,再分析这部分
独立代码块里主要完成了两部分工作, 一是给一些变量赋初值:0或0xF,二是给buf2和一段明文内存放进6160函数, 动调跟了一下感觉就是一个申请内存并memcpy, 并且还动了一个Size变量的值
Buf2附近的内存,可以猜测这还是一个String, size就是该string的size, 声明一个结构体
看到这儿内存的中文我认为应该先运行一下看看前面是不是都是输出,都是输出就没什么好看的了, 直接分析下面的代码块好了
接下来是这样的结构,我们结合动调看看
给106一个定值,然后转成字符串塞到以432+5为末尾的内存, 有点类似栈的先进后出
112和113分别是字符串的首地址和末地址