0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end
0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end
Share Dialog
Share Dialog

Subscribe to shaneson.eth

Subscribe to shaneson.eth
凌晨12点半左右,咖啡突然让我帮忙打个合约安全比赛。我想着先看看题,然后,不小心就通宵了~~~~~
这道题的难度设计非常有意思,最难的地方利用了0.8.15以下的编译器漏洞。注意:0.8.15以下的编译器都会有这种漏洞。原因:0.8.15在动态内存管理的时候,由于太过着急清除内存,导致了数据丢失,在特定的情况下可以被黑客利用,从而绕开检验,从而进行攻击。由于攻击条件太过苛刻,所以一直没有被黑客利用。但,我们在设计calldata结构的时候,还是要知道有这个的存在~~
题目非常简单:
存在一个NFT Market合约,在初始化的时候会产出3个NFT,分别是NFT 1,NFT 2,和NFT 3。黑客需要攻击NFT Market,从而窃取这三个NFT。这三个NFT都分别上架道NFT Market上,价格为:1, 1337, 133333337。
这个时候,NFT Order为:[ #1, #2, #3]

NFT 1是最容易获取的,我们先触发一下airdrop,拿到5个TcffToken,然后用1个Token来买NFT 1就可以了。
此时,
黑客余额:4 Token
NFT Order为:[ #3, #2]

Tips:
NFT Market有余额:1337
用户拥有的NFT: NFT1
窃取NFT 2需要用到 purchase Test函数(如下),注意到NFT 2和 NFT 3的owner是NFT Market合约本身。所以,这里刚好利用purchase Test函数,让黑客创建一个NFT 1价值1337的order,然后让NFT Market通过purchase Test函数利用1337余额去买用户手里的NFT 1。这样,用户就可以获得 1337 + 4的余额。

然后,就有足够的金额去购买NFT 2。(价值1337,用户的余额是1337 + 4 )。这里不着急把NFT 1买回,因为攻击3的时候会用到。但为了让用户可以把NFT 1买回,这里需提前插一个NFT 1的订单(因为此时NFT 1还是属于黑客)。
攻击步骤:
此时,
NFT Order为:[ #1, #3]
攻击NFT 3 非常困难,需要利用到0.8.15以下的编译器漏洞。这个漏洞的详细报告在:
https://blog.soliditylang.org/2022/08/08/calldata-tuple-reencoding-head-overflow-bug/
总结一下就是:
这个错误源于,编译器在ABI编码期间将calldata数组复制到内存中时过度急于清理的结果。内存中的数组总是占用32字节的倍数,当基本类型没有填满整个字时,未使用的空间保证被清零,并在所有高级Solidity操作后保持清洁。在受影响的情况下,编译器会发出代码,错误地清理存储在元组最后一个组件中的数组的末端,将属于元组第一个动态组件的32字节清零。
我们要利用这个漏洞,绕过verifiCoupon的合约验签,从而黑客产生一个可以修改价格的Coupon。(当时我和薛神在纠结如何通过合约地址,暴力破解反推出私钥。看来思路是错的,应该是攻击calldata从而绕过签名验证)

攻击步骤:
a、创建一个FakeNFT ,并且插入到NFT Market之中。此时,NFT OrderList:
NFT Order为:[ #1, #3, #fakeNFT]
然后我们把#1用1 Token买回,此时:
NFT Order为:[#fakeNFT,#3]
b、call data攻击,攻击的步骤很简单,就是利用上面说的编译器漏洞,然后coupon的orderId传1,但是orderInfo传0。由于编译器漏洞,在verify的时候,orderId1,会以order 0进行验证。

然后 NFT 3的价格就可以被我们修改成1 Token了。我们买回NFT 3即可。
凌晨12点半左右,咖啡突然让我帮忙打个合约安全比赛。我想着先看看题,然后,不小心就通宵了~~~~~
这道题的难度设计非常有意思,最难的地方利用了0.8.15以下的编译器漏洞。注意:0.8.15以下的编译器都会有这种漏洞。原因:0.8.15在动态内存管理的时候,由于太过着急清除内存,导致了数据丢失,在特定的情况下可以被黑客利用,从而绕开检验,从而进行攻击。由于攻击条件太过苛刻,所以一直没有被黑客利用。但,我们在设计calldata结构的时候,还是要知道有这个的存在~~
题目非常简单:
存在一个NFT Market合约,在初始化的时候会产出3个NFT,分别是NFT 1,NFT 2,和NFT 3。黑客需要攻击NFT Market,从而窃取这三个NFT。这三个NFT都分别上架道NFT Market上,价格为:1, 1337, 133333337。
这个时候,NFT Order为:[ #1, #2, #3]

NFT 1是最容易获取的,我们先触发一下airdrop,拿到5个TcffToken,然后用1个Token来买NFT 1就可以了。
此时,
黑客余额:4 Token
NFT Order为:[ #3, #2]

Tips:
NFT Market有余额:1337
用户拥有的NFT: NFT1
窃取NFT 2需要用到 purchase Test函数(如下),注意到NFT 2和 NFT 3的owner是NFT Market合约本身。所以,这里刚好利用purchase Test函数,让黑客创建一个NFT 1价值1337的order,然后让NFT Market通过purchase Test函数利用1337余额去买用户手里的NFT 1。这样,用户就可以获得 1337 + 4的余额。

然后,就有足够的金额去购买NFT 2。(价值1337,用户的余额是1337 + 4 )。这里不着急把NFT 1买回,因为攻击3的时候会用到。但为了让用户可以把NFT 1买回,这里需提前插一个NFT 1的订单(因为此时NFT 1还是属于黑客)。
攻击步骤:
此时,
NFT Order为:[ #1, #3]
攻击NFT 3 非常困难,需要利用到0.8.15以下的编译器漏洞。这个漏洞的详细报告在:
https://blog.soliditylang.org/2022/08/08/calldata-tuple-reencoding-head-overflow-bug/
总结一下就是:
这个错误源于,编译器在ABI编码期间将calldata数组复制到内存中时过度急于清理的结果。内存中的数组总是占用32字节的倍数,当基本类型没有填满整个字时,未使用的空间保证被清零,并在所有高级Solidity操作后保持清洁。在受影响的情况下,编译器会发出代码,错误地清理存储在元组最后一个组件中的数组的末端,将属于元组第一个动态组件的32字节清零。
我们要利用这个漏洞,绕过verifiCoupon的合约验签,从而黑客产生一个可以修改价格的Coupon。(当时我和薛神在纠结如何通过合约地址,暴力破解反推出私钥。看来思路是错的,应该是攻击calldata从而绕过签名验证)

攻击步骤:
a、创建一个FakeNFT ,并且插入到NFT Market之中。此时,NFT OrderList:
NFT Order为:[ #1, #3, #fakeNFT]
然后我们把#1用1 Token买回,此时:
NFT Order为:[#fakeNFT,#3]
b、call data攻击,攻击的步骤很简单,就是利用上面说的编译器漏洞,然后coupon的orderId传1,但是orderInfo传0。由于编译器漏洞,在verify的时候,orderId1,会以order 0进行验证。

然后 NFT 3的价格就可以被我们修改成1 Token了。我们买回NFT 3即可。
<100 subscribers
<100 subscribers
No activity yet