然后我尽然用暴力。然后没有结果。白白浪费了一天。
一定是第一天的题目纯洁了我的心灵。导致我忘记了,被出题人支配的恐惧。
显然暴力不仅无解还会,陷入一个死循环穷举5个62个字符长度,6个62个字符长度。7个62个字符长度,这是穷举已经变得不可能。没错我穷举了,来嘲笑我吧。
当输入4个字符的时候 ,我们不在讨论。
输入字12个字符的时候,程序会要求我重新输入,od跟随,表明程序会发生溢出。所以我定想程序很有可能时溢出到一段代码。
这里直接讨论输入12个字符
!
作者作为防守方,其实是有诸多限制。
但是这里却有一个溢出,如果溢出能直接溢出到“You Get it”,那么作者就玩完了,因为此时此题必定多解。如我所料。YouGetit地址是
。
显然不是a-z,A-z,0-9,(0-9)字符,不符合比赛要求。其实程序可以直接溢出到这里,但是不能手动输入,但是复制粘贴亲测可用。
能出题的作者肯定是对自己题目有自信的,在作者脑中中题目绝对是唯一解的。并且由于作者是汇编写的程序,显然是为了对程序的流程有最大限度的控制。所以溢出绝对是这次的关键。
作则想溢出又不想多解,所以要明确两点。
所以对填充数据没有限制是造成多解的直接原因
显然直接溢出是不符合出题条件的。但是,毛主席说过没有条件,就创造条件,
我们可以加一段代码来限制填充的数据。
到这里答案就已经出来了。作者想溢出到一段代码,由这段代码检查溢出的填充数据,这样就保证了输入的唯一性。
现在留给我们的任务就是定位该溢出到什么位置。用IDA反汇编查看。
同时由于输入被限制在a-z,A-z,0-9,(0-9)字符之间因此溢出位置十分有限。0x40xxxx肯定不可能了因为0x40是@。所以从0x41xxxx开始找。IDA开始找。
哈哈看地址0x00413131。这数据非常奇怪而且地址都是0x00403131都满足字符要求。
先溢出到这里试一试,现在只要随便输入12个字符末尾加上11A就好了。程序自然就会溢出到这里。
一看果然是一条可执行的指令,一路F7。发现可以执行,显然是花指令。追踪代码提取关键。
最终提取到,三个公式。
将答案写到WinHex中,注意小端序
提供一个计算线性方程的网站
http://www.yunsuanzi.com/cgi-bin/linear_system.py
现在在来站在作者的角度,作者想不让人分析出来,同时又怕没一个人做出来。
因为作者完全能够将溢出点,溢出在这段异常数据的中间,试问。如果溢出点在这段程序中间,我们怎办。甚至作者将溢出点藏在别的位置,打散分开在代码中间,先执行代码变形,在跳到检查位置。或者是直接上硬编码。
作者真的是十分厚道,但是也确实够“阴”。这道题目真的很有意思。
今天其实看雪第三道题目已经接近尾声了。第三道题目和第二道题目虽然解法不一样但是思想其实是相同的。
之前直接发word,被退回来了,还好给推回来里面全是错误今天重写的时候才发现。这回换Markdown。顺便把之前的错误给改了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!