①猫咪银行: (2018中科大hackgame)
一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个。
理财是只能买入TDSU才可以获得收益。我们先上来直接把CTB全部换成TDSU。
上边是我们花了所有TDSU:66060买了19分钟后的收益。(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作) 还是不行,算上收益的钱1200231也不够买20个CTB。
考虑买RMX是否存在汇率差。
发现一个CTB57个RMX,一个RMX值115TDSU,也就是一个CTB值6555个TDSU,还不如直接买。
只能考虑另外的情况:
整形溢出
在买入份额上输入很大的数或者负数,都会有错误提示,交易失败。此处不存在整形溢出。 再买入时间上输入很大的数
成功溢出。仔细观察这个值,会发现。
是int64类型的溢出。
直接购买9223372036854775808时间,份额为1000,收益仍为负数。尝试将时间慢慢调小。 9123372036854775808(第二位2改为了1)成功让世间变为负的,且收益为正.(跳不出来慢慢调,后边写下原理)
时间为负的直接去出来就好了,然后兑换flag。
②LTshop(护网杯)
前边的条件竞争不说了,开个burp多线程买几个大辣条,买4个就好了,为啥起码4个,后边有介绍。
其实看到最后的9999999999.......个大辣条换flag也能猜到是溢出。
这里存在uint64整数溢出。 2^64-1为最大值:18446744073709551615
这里如果我们直接输入18446744073709551615,服务器端肯定会先给你 *5,为啥呢?
因为判断你大辣条的数目啊,一个辣条之王得用5个大辣条来换啊,所以溢出过大了,而我们的要求是正好溢出一点点,所以说除以5=3689348814741910323。
这个时候输入3689348814741910323,服务端 *5=18446744073709551615,虽然表面上是18446744073709551615,实际上为0。
所以我们稍微加1,输入3689348814741910324,* 5=18446744073709551620,实际上服务端以为我们只买4个大辣条。所以成功购买那么多大辣条。
总结的问题
①uint64溢出范围0-18446744073709551615(没有负数哟)
②为什么非要买4个大辣条,你输入的数据乘以五后是18446744073709551620。
溢出界限(最大数)是18446744073709551615,也就是说这个数字还没有溢出,一旦加1,就变成了0,也就是说18446744073709551616代表0,以此类推18446744073709551620代表4
③这两个题目溢出类型不一样:
猫咪银行是int64,存在负数,所以构造的时候钱数有可能是负数,所以你得自己计算收益(和买入时间和买入份额有关系。)
ltshop没有负数,不然的话18446744073709551615+1=18446744073709551616实际上代表了-18446744073709551616你得再加上18446744073709551617=36893488147419103233才能代表买一个大辣条。
④关于ltshop为什么是uint64溢出,我也不知道啊,凉了啊。
别人的wp上边是看的cookie,知道了框架,然后才知道的溢出类型,如果你实在不知道什么溢出类型,那你就把这几个溢出类型挨个试一下。
⑤猫咪银行那到题目不是随便买的,而是猜的。
虽然9223372036854775807是最大数,但是你的收益和时间才是最终决定你溢出是否成功的条件。我们得想个办法让你的收益溢出的时候为较大的正数并且满足时间为过去的时间,或者取出时间在20分钟之内。所以我们输入的数要先让他达到溢出的临界值。
然后让这两个数在-9223372036854775808到9223372036854775807之间达到我们想要的,计算的话太麻烦了,不如直接猜,每次一个范围一个范围的测试就好了。
好像太大了也不行,会出问题,比如我一开始输入很大的数,怎么调都是-9223372036854775808