-
-
[原创]看雪10月ctf2017 TSRC 第二题——一道有PWN影子的CrackMe
-
发表于:
2017-10-28 06:50
5162
-
[原创]看雪10月ctf2017 TSRC 第二题——一道有PWN影子的CrackMe
这道题真是坑啊!!!我前面一天都踩坑里了,踩到怀疑人生。。。(可能是因为我菜(逃
这道题,看起来很简单!!!打开发现是一个二元方程组
OK,4个线性方程组,解出来,就是答案,对吧?
不对!!!!!!
因为就算考虑溢出(MOD 0X100000000之后),这个方程组仍然无解!!
然后我就怀疑人生了。。。
但其实这是有道理的,
1.大家看,这个输入是有缓冲区溢出漏洞的,输入12个字符之后会触发缓冲区溢出漏洞,这就是为什么输入12个字符会重新跳到开头执行,是因为最后的0x00覆盖到了第13个字节,这本来是返回地址的最低字节,所以返回地址被改成了0x401000,即开始处。
2.我们假设,这4个线性方程组有解,那么能影响到结果的只有前8个字节(二元,每个是个int,4字节),而9到12这几个字节就会被verify()的push ebp覆盖掉,那么这4个字节就不会影响结果!即,这个答案多解。好,那么我们反过来想一想,看雪的CTF是不可能多解的,所以,这种常规的套路必然不可得出正确答案!
再来考虑一下,什么时候有可能会用到9-12这些字节?scanf的时候获取输入,verify() push ebp的时候破坏9-12这些字节的数据,那么说明,这些数据的使用只有可能在调用scanf到调用verify这之间!
retn之后就直接是verify了,然后push ebp破坏9-12的数据
我是想到两种可能性:
1.作者修改了_scanf的代码,获取input数据,并且以此修改key处的数据。
2.利用缓冲区溢出漏洞,retn跳转到其他地方,在那里输入的值被获取,并且处理,然后影响注册的成败
我其实一开始以为的是第一种可能性,就差逆出scanf算法看他有什么猫腻了。。结果想想其实不是,因为IDA识别出了他是_scanf这个函数。。。如果作者修改了这个函数,IDA可能识别不出来这是个_scanf。
这个时候再看看IDA,
注意这里直接从401130到413131跳了很多个字节!!(413131之后的这些代码本来在IDA是数据形式显示的,我自己c成代码的
c成代码之后,想一想,这些代码不像是正常编译器能生成的,很可能是作者弄的。再看看他的地址413131,有没有feel到什么,没错,就是ASCII字符串"11A"!作为二进制研究人员,我们对0x30(0) 0x41(A) 0x61(a)这些范围的数要非常的敏感!
那我们试一试,利用缓冲区溢出在retn的时候把eip跳转到这里,输入11112222333311A,回车
看esp,指向输入,这边直接ctrl+F11,看看会发生什么。。。我一开始是一步一步跟的,但是花指令太多了,跟着很累,所以直接run跟踪了。。。
结果发现,这个对输入操作是有规律可循的!
花指令去掉,汇编是这样的。。。最后那个jmp
15行sub了一个很奇葩的常数,然后有个je,我们随便输入数的话这个je是不会跳转的,在jnz跳转的话,必然会掉到走向错误注册的道路里去(18行的pop eax),有兴趣大家可以跟一下。还有,这个对[0x41b034]的处理貌似没什么用,虽然这就是前面的全局变量key。。。
OD里面,执行15行指令前,把eax改成0xeaf917e2,ctrl+F11发现,有新的汇编代码,然而最后又跳入pop eax那个走向错误的道路。。。
再来一次,这次sub eax,0xe8f508c8下断,这次我们把eax也改成0xe8f508c8,ctrl+F11,发现又有这么一堆类似的东西,也是类似的运算,减一个魔数,熟悉的味道,后面这个的代码跟前面两个差不多,我就不放上来了。。。但是最后一次暴力改的话会扔出异常。我猜是因为我们输入还是111122223333,他可能是用输入的值动态生成跳转到的成功代码块的地址的,没研究,因为这样的三块玩意已经足够我们就得到一个三元的线性方程组了。。。
(input0-input1)*3+input0-input2 == 0xc0a3c68
(input0-input1)*3+input0+input2 == 0xe8f508c8
(input0-input1)*4+input0+input2 == 0xeaf917e2
直接上网找个解方程的网站(http://www.yunsuanzi.com/matrixcomputations/solvelinearsystems.html)
# 您输入的问题如下:
# 系数矩阵A:
# 第1列 第2列 第3列
# 4.0000 -3.0000 -1.0000
# 4.0000 -3.0000 1.0000
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)