-
-
[原创]
-
发表于: 2017-11-3 01:30 2334
-
不得不说,这题简直要了老命,能力还是太差了。。。。从题目放出来的时候开始,一直做到第二天晚上才做出来,中途无数次想放弃。
首先,需要跟到对输入进行处理的地方。在函数406FC3里面,看到对KanXueCrackMe2017进行了变幻,然后对一个48大小的int数组进行了初始化啥的,最开始我没管它,一开始看到一串base64,想到应该是个障眼法,事实证明也是如此。
看到有条指令int2d,猜测应该是用了异常处理链来处理输入,在异常处理链的顶端下断,运行之后也是证明了自己的猜想。
函数执行流程大致掌握之后开始分析过程。
看到最后比对有三处,一处是4071A0处的比对俩个数组要一致,其中被比对的是0-47顺序排序的int数组,而另一个则是顺序经过变化的48大小的int数组;第二处是4071AC处的函数,要使其返回1,第三处是4071C5,输入长度要为0xc。
首先要搞明白经过变化的48int数组是如何变化的。可以看到,在数组初始化函数407307中,俩个比对的数组的顺序内容其实都是0-47,只是其中一个经过KanXueCrackMe2017的数据变化后,打乱了顺序,所以我们的输入需要将其还原回来。
接下来看KanXueCrackMe2017是如何变化数组的,事实上,在题目中,处理字符串的时候,将字符串‘0’-‘9’减去了‘0’;‘A’-‘Z’减去了‘7’;‘a’-‘z’减去了‘=’即0-61,最后转换成‘0’-‘9’及‘A’-‘H’即0-18,所以是将62进制转换成18进制。这一部分是在函数40829C中完成的。
知道字符串转换后,看它是怎么操作数组的。可以看到数组的操作表是有规律的,即按照函数sub_4084A3实现。所以只要将每一张表的旋转次数补足4次,即可转回去。按照这种思想,逆推数组,即可得到绕过第一个检查的解。
根据上述思路逆推出一个解ieunV2phk6yPywNtJ,发现程序弹框差一步就成功了。
第二个检查好复杂,所以想着想绕过第三个检查,说不定也就过了第二个。思考如何使输入长度缩小至12,想着是不是这个输入的操作,有几步是可以结合的,如1与1可以合并取消这一次操作,3与4合并为5,按照这样的方法去处理,果然缩小了输入的长度,同时得到了输入CcLaoE37J45Y,输到程序中,得到了成功的弹框。成功。。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: