感谢出题者lelfei,与第一题的简明相比,第二题明显有难度,已经让人怀疑人生:(
看这个势头,做出一题算一题……
好吧,下面开始正题
-----------
用到的工具:OD,ida,十六制的编辑器
总体上,如果没有相关的奥数知识作为背景,就需要穷举,方式一是自己编程实现;方式二工作量小一些,直接在OD里面改,缺点就是比较慢,每秒大概100~200个数,如果crackme运算效率再低点,不会编程就可以直接歇了
cm用到一种大数库,每个大数用到相关联的2张表,每表元素数0x400个,表头一个dword是个标志,下一dword是大数的长度,初始为0,后面是指针或数据了,指针寻址用,用表1的指针找到表2指针,再用表2指针确定表1数据的具体位置,大数的每一位0~9占据1个dword
程序用到的几个函数:
1.初始化
用缓冲区的立即数初始化
另一初始化函数
调整函数:处理进位的情况,确保每一位置上数字均小于10
取数据长度
取指定位置的一位数
复制函数
复制或相加
用立即数乘,注意乘法的顺序是反的,即如果你输入的是123,去乘以4,实际上是321*4=1284,结果再扭一下变成4821
作了一些封装的乘法
两个大数相乘,结果在Ecx指向的大数中
比较大数,根据参数可以选择比较的方向
程序的主体逻辑
先取得输入,长度应为8-20长的数字,不含0
输入应为数字,不含0
以下为计算过程,设输入的数字为n,用它来初始化两个大数L1,L2
L1=L1*9
L1=L1*L2
[培训]科锐逆向工程师培训第53期2025年7月8日开班!