-
-
[原创]第9题分析
-
发表于: 2016-11-19 21:15 4250
-
工具:OD+IDA+BigIntCalc
程序没有加花,拉到IDA里找到MessageBoxA(0, "Success!", "Congratulations", 0)代码段,直接F5,发现有很多个循环。
用OD简单调试一下,流程大概为:注册码为23位;将注册码切成几段,分别加以转换,生成7个数值并放到7个长字符串中;长字符串16进制转换为2进制,并分别加以计算,生成4个字符串再转换回16进制;把4个字符串去掉前面的“0”合并进来,与一个固定字符串“57AEA642D24E4080B23177BFCC40814EB73DBD01E92480C85C3C4046662C10000”比较,相同则成功。
IDA里看看字符串的计算过程,可以猜出是一个大数计算器,把16进制转换为2进制存放到一个结构中:struct{byte;byte;word;char[512];}其中第1位为大数的正负号,第2位保留,第3个word保存字符长度,最后1个char为2进制值。猜出大数计算器后流程就很清晰了:
字符串切了4段,把切下的字符串按a-z分别代表0-25的26进制数值,再转换为10进制的数字字符串,复制到16进制字符串中。
s1=h26(b0_b4);
s2=h26(b7_b11);
s3=h26(b16_b22);
s4=h26(b21_b22);
s5=h16(b5_b6);
s6=h16(b12_b13);
s7=h16(b14_b15);
sn=s1*s5+s2*s6+s3*s7+s4^s7;
第四部分:
其中注册码第4部分为s4的s7次方,其中s4是3位0-9数字,s7是2位0-9数字。本想写个程序暴力枚举1000*100种可能的,结果发现超过10次方就溢出了,只好找出大数计算器BigIntCalc,缩小范围手动枚举了。
观察到注册码后5位为“10000”,可以从这里做突破口:一个3位数的2位数次方,结果的后5位为10000。可以推出3位数的个位与幂的范围为:
个位为2、6,幂为10;(个位为0xA,0xE时也成立,但超出取值范围0-9了)
个位为4,幂为8。
分别让十位取值为0到9,发现个位为2时,结果的倒数第6位都不为C,排除个位值2。
再试百位取值0到9,发现s4=316,s7=10时,0x316的0x10次方结果为“40814EB73DBD01E92480C85C3C4046662C10000”,与注册码后面部分完全相同!可以先确定b21_b22=me(316用a-z转换为26进制值),b14_b15=16(0x10转换为10进制值)。
第三部分:
s7已经有了,只需要找出s3为9位0-9数值即可,0xB23177BFCC/0x16=819857172正好符合。把819857172转换为26进制:(2,17,0,2,10,12,4),用a-z表示为crackme,后2位也正好与s4的26进制值me相同。
第二部分与第一部分:
还剩下16位,正好这二部分各8位,要分解成7位乘2位,D24E4080=3493902*40=6927204*20都符合纯数字,因此s6=20,s2=pediy或s6=40,s2=hqumw都可行。同理,57AEA642=2943211*22=5286422*11也符合纯数字,s5=11,s1=loudy或s5=22,s1=gllwl也有2组答案。
最后,选取最顺眼的一组答案拼成注册码:loudy11pediy2016crackme
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!