首页
社区
课程
招聘
[原创]第八题分析
发表于: 2016-11-16 23:43 2683

[原创]第八题分析

loudy 活跃值
10
2016-11-16 23:43
2683
第八题分析

      此题主要难在是64位程序,平时分析较少,分析工具缺乏,平时用得较多的OD派不上用场,算法倒不难。
      之前也没分析过X64程序,这次结合X64gdb和IDA Pro得到结果。
 
      一步步跟,可以跟到上图所示关键处,cmp ecx,eax是关键比较语句,隔一行的je为关键跳转,可以在此处爆破。IDA的分析结果更直观,如下图(注意其中偏移不一样)。
 
      而分析可知,eax=rdi*3,ecx=rdi*2+[0x140025CC0(注意偏移转换)+0x30]处的值,且该偏移处的值固定为0x134。要使等式成立,必须rdi=0x134。而该rdi值为函数sub_1400014B0的传入参数。
 
      从上图可以知道函数sub_1400014B0的输入参数为函数sub_140001300的返回值。进入sub_140001300内部,F5查看C语言伪代码。
 
 
     代码最后返回前的while循环是关键,其关键算法思想可以表示为找到一个数v1使得v1的平方除以v3余数为v2。v1为返回值,若要正确注册v1=0x134;v2=函数sub_140001300的输入值;v3=十进制位数大于v2十进制位数的最小整数,例如:假如v2=123(3位),那么v3=1000(最小的4位数)。
      V1=0x134时,v1的平方二进制表示为94864,因此v2可取的值为十进制94864、4864、864、64、4。但由于v1从0开始搜索,除了94864、4864外,其它几个数都在v1小于0x134时满足条件,因此只有94864、4864满足。当然这两个数加上前置0不影响结果,所以094864、0094864、04864、004864等等都满足要求,结果不唯一。
      而v2即为函数sub_140001300的输入值,也即用户输入的十进制数,因此可以求得注册码,填入任意一个(比如4864),如下图,注册成功。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//