2022蓝帽杯 Loader 题解
前言
逆向这个属于是费神,费力…主要函数功能还是要靠调试和猜测来进行得出…写此篇文章也希望能对后续的复现者能够有所帮助
子程序程序主函数
直接拖到IDA
中,程序会分析出来对应的主函数,在主函数我们可以观察到一个VirtuaalProtect
函数,通过程序名称我们也可以知道程序是一个加载一个新的PE
来完成对应的功能。为了到新的子程序中,我们采用调试将对应的数据段按P
进行构建函数,通过不断的测试哪些地方会调用输出的方式我们找到对应子程序的main
找到之后就是开始我们漫长的调试之路了…
过程分析
进入到子程序的主函数后,我们调试可以得出一些信息,比如哪些是输出,和输入,同时我们会注意到检测flag
的格式的部分:
可以判断出来程序的主要部分是flag{XXX}
总共的长度是42
位
之后的调试需要我们多次切换到对应的内存中去观察,尝试去取对应的十进制
数据多次观察后我们可以发现程序将我们的输入转换为了无符号的long long
类型的一个数据,毕竟我们输入的也是字符串,如果程序需要进行对应的加密也需要将我们的输入转换为数字,方便后面的运算
之后程序会将你的输入进行判断,判断是否在大小区间内,如果不在范围内就会跳转到错误处,结束程序
在我们标出对应的数据后,整体逆向就轻松了许多,我们大致可以猜测_mm_lodau_si128
是将后面的偏移地址处的数据进行加载,那么可以猜测在这个前后应该会有加密部分
我们不断调试可以发现这个加密函数的一种特点,即前两个是运算的数据,最后一个为保存数据的偏移地址,通过这个特点,结合调试,我们可以找到另外的几个加密函数,如下:
上面两个函数通过调试与观察对应的内存空间我们可以发现其过程就是一个乘法,但是因为两个数相同,即为求平方
同时一个数据比较坑的是下面的一个减法
运算,和进行比较最后的a3
处的偏移地址的值是否等于9
在减法运算中,两个数据被转换为了unsigned int
类型而加的0x100000000i64
已经发生了溢出,对应的后32位字节我们得到的是 0 ,因此在加法运算中我们将其忽略即可。
大致流程在多次调试后可以理出来一个计算公式:
$$
input1^2-11*(input2^2)=9
$$
其中输入的要求长度为42
,我们减去flag{}
的长度可以发现是18*2 (36)
同时我们的输入也是拆成了两个长18
的数据进行计算,因此input1
为我们输入36
位数字的前18
个,input2
为输入的后18
位数字
对此我们可以采用:https://www.wolframalpha.com/ 进行求解
发现计算出来的y
少了一位,我们将其补上一个前缀0
即可得到flag
:
1 |
|