-
-
[原创]第八题分析
-
发表于: 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),如下图,注册成功。
此题主要难在是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期)
赞赏
他的文章
- [原创]看雪.TSRC 2017CTF秋季赛第三题分析 6520
- [原创]CTF2017第二题分析 3358
- [原创]第一题答案 2373
- [原创]TX2017游戏安全知识竞赛第二轮第二题 8222
谁下载
谁下载
看原图
赞赏
雪币:
留言: