-
-
[原创]看雪2018国庆题--叹息之墙 writeup
-
发表于: 2018-9-30 08:44 3371
-
上IDA分析,发现有大量混淆,稍微翻一下就会发现流程控制关键在[esi+301Ch]
,如下代码:
每个小流程结束后都会设置[esi+301Ch]
,jmp loc_45C132
再jmp loc_40A09B
。于是OD跑一次并记录[esi+301Ch]
的值变化。
通过IDA与流程记录文件,分析代码。里面大部分代码直接跳过,只看特别之处。如:
以上代码作用只是调用了maybe_sscanf
函数。
以上是检查[esi+3052h]
值,条件跳转的代码。
这仅仅是无条件跳转。
这段代码实际上是条件跳转,以text:0044F170 mov dl, 1
为条件,其它类似的只需关心dl
的值。
小流程中的代码大多与以上类似。看一眼就能明白在干什么。
理完,程序过程大概是:
用大步小步算法,算出一个sum
的值0x55121c15
,跑了下,结果没结果。
用(0x65757832** r)%0xFFA1CF8F == 1
得到检验式的值周期为0xFFA1CF8E
。
发现sum的个位始终是7(0x55121c15+0xFFA1CF8En = 1427250197 + 4288794510n)。
又发现表中数据基本都是个位为0;数据成对相加结果为0xFFA1CF8E;里面有多个等比数列,最后整理出9组数,每组的数都是此组最小元素的倍数。正合“正确的序列号由不超过9整数构成”的提示,从9组数中各选出一个数,这样就没有多解的情况(当然也有整数个数小于9的情况,只要每组选出不多于一个数,就没有多解的可能,可暂先不考虑)。
最终得出答案:17x27x60x97x133x161x243x292x309X
用过的脚本,使用过程中一直在改变,前面用到的都在注释中:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课