-
-
[讨论][原创]第二题 lelfeiCM的writeup
-
-
[讨论][原创]第二题 lelfeiCM的writeup
使用IDA工具装入lelfeiCM.exe很容易来到main函数,粗略阅读汇编代码,得出注册序号的格式的长度满足整数区间[8,20],且ASCII码满足整数区间[1,9]。
我使用InputKey辅助标记输入的字符串变量
先观察第一个重要的函数调用
发现使用了ecx,并且接下来的汇编大量使用了ecx寄存器传输数据结构地址,可以反推出这个数据结构是一个类,猜测如下:
先来看bignumber变量与InputKey的第一次交集,最后一行标记的Assign_char_调用的作用是将InputKey表示的数字依次放到BigNumber数据结构中,
还原一下函数形式BigNumber::Assign(char* input), 表现为bignumber = '123456789'
进入Assign_char_发现有两个直接调用,
第一个调用的作用就是SetVal(INDEX,VALUE),val [ idx [ Index ] ] = InputKey [ Index ] - '0'
第二个调用就是为了进位计算的,当某一位大于或等于10时,向前进位
来到第一个关键的调用,经过分析,该函数作用是计算BigNumber与数字乘法运算的
还原一下形式BigNumber::Multiply(int multiplier)
必然还有另外一个函数BigNumber::Multiply(BigNumber multiplier)
恰好下一部分就是对BigNumber::Multiply(BigNumber multiplier)的调用,
首先使用构造函数初始化TmpHandler,然后调用 this->MultiplySelfKey(TmpHandler),MultiplySelfKey就是乘法运算的实现
MultiplySelfKey与MultiplyWith_9的汇编代码大同小异。
紧接着又是一个MultiplyWith_9
看到这里就是为了计算 Number = Origin*9*Origin*9,然后判断大数长度是否是奇数,
最后是判断两个子数字的海明距离 HammingDist,
当满足bigNumber.HammingDist(TmpHandler,...)判断大数前部分和后部分与原始数的海明距离之和为0时则转到well done的打印输出。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!