欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]第二题 lelfeiCM WriteUp

[原创]第二题 lelfeiCM WriteUp

    本题的难点在于输入的内容会被分散的存放在作者构造的表中,影响判断的跟进。不过只要弄清楚对表特定位置内容的操作等同于对输入数据的操作就可以解决这样一个问题。

    首先是判断输入的内容和长度,要求输入数字并且在8到16位。

    之后的sub_4012c0和sub_4014e0是初始化表和将输入内容存到表中的操作。存放的方式是将输入内容的每一位分散的存放在表的不同位置中。完成一次操作后会修改一次存放的位置。不过深入跟进就可以发现虽然位置一直在变,但处理的还是那些数。

    接下来的sub_401730函数是将输入内容乘9的操作。由于作者把每一位存放到不同位置中,因此这个乘法也比较特殊。先把每一位乘9,然后如果某一位乘9之后大于10的话,就保留个位数,将十位数进位到下一位。这样其实就是把输入的数乘9。值得一提的是,输入的首位是作为个位,输入的末位是最高位。也就是计算时是对输入的倒序进行计算的。

    接下去到while循环里的计算过程,关键函数是sub_401840函数。sub_401840函数里面主要还是执行sub_401730。只不过两个乘数发生了变化。在这里是上一步算得的值左移后再乘以输入的每一位后累加。例如,上一步算的的值为11111,输入的值为54321.那么这一步就是11111*5+111110*4+1111100*3+11111000*2+111110000*1。其实不难发现,这就等于11111*12345。所以这一步其实就是将上一步算的的值再乘以输入的倒序对应的数字。因为计算流程就是sub_401730函数,在这就不贴图了。

    接下去还是一个sub_401730,这回传参固定是9,所以就还是对上一步算的的值乘9。

    

    至此对输入的计算流程已经结束。假设输入为n,则计算过程为(n*9)*n*9,其实就是(n*9)^2。

    接下去是判断部分,首先判断计算得的结果位数是否为奇数位。如果不符合的话会继续之前的流程,也就是平方变成立方,以此类推。


    之后会取输入的第一位和计算得到的值的中间一位进行对比,相等才能通过。同样如果不符合的话会继续之前的流程。


    如果两个值相等,会在sub_4013e0中进行下一步比较。比较的内容是计算所得的值的前7位是否和输入内容相同,后7位是不是输入内容的倒序。比较过程见下图。

    我在到达这一步的时候搞错了,以为他是要求计算的值是个回文数,并且回文内容和输入内容相同。因为之前我们计算该值的时候是一个平方的操作,如果计算得到的值是个回文数,那就是一个完全回文数。谷歌了一波找到了这篇文章http://www.worldofnumbers.com/square.htm。不过从他给的数据看没有发现一个回文内容是输入内容的完全回文数。后来又看了一遍算法才发现,他在进行判断时并没有将计算所得的值中间一位的左右两个值算进去。那么根据我们从那个网站的内容中所发现的,这个值其实就是12345678987654321

    12345678987654321这个是是个完全回文数,他是111111111的平方。恰好12345679*9=111111111,那么我们的输入为97654321。判断时,12345678987654321的中间一位9和输入第一位相同,排除掉中间一位的左右两个8,其余的回文内容刚好是输入的内容,因此符合题目的判断要求。那么正确的输入就是97654321。当然也可以写个脚本爆破一下。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功