aliyunCTF HappyTree WriteUP

WriteUp 1年前 (2023) admin
450 0 0

嗨嗨嗨嗨

这次aliyunCTF的Blockchain,考了三个知识点

  • MerkleTree验证
  • assembly中的return trick
  • solidity 优化器漏洞

如果您感兴趣,可以去aliyunCTF尝试一下,比赛结束后7天内,题目环境不会关闭哦

题目

Sources

Public的function只有isSolvedb

isSolved 是本题目标,当 x == 2 && y == 4 时,解题成功。

aliyunCTF HappyTree WriteUP

漏洞1 MerkleTree验证叶子时,未检查叶子高度

速览 b function

    function b(
        bytes32[] calldata leafs,
        bytes32[][] calldata proofs,
        uint256[] calldata indexs
    ) public {
        require(leafs.length == proofs.length, "Greeter: length not equal");
        require(leafs.length == indexs.length, "Greeter: length not equal");

        for (uint256 i = 0; i < leafs.length; i++) {
            require(
                verify(proofs[i], leafs[i], indexs[i]),
                "Greeter: proof invalid"
            );
            require(used_leafs[leafs[i]] == false, "Greeter: leaf has be used");
            used_leafs[leafs[i]] = true;
            this.a(i, y);
            y++;
        }
    }

可知, 我们要传入4片leafs叶子 && 4根proofs树枝。

4片叶子不能有重复,且只有验证都通过,才能让 y == 4

题目已经给出了3片叶子

0x81376b9868b292a46a1c486d344e427a3088657fda629b5f4a647822d329cd6a
0x28cac318a86c8a0a6a9156c2dba2c8c2363677ba0514ef616592d81557e679b6
0x804cd8981ad63027eb1d4a7e3ac449d0685f3660d6d8b1288eb12d345ca2331d

还不够,还需要another one.

看一下叶子的verify函数

function verify(
        bytes32[] memory proof,
        bytes32 leaf,
        uint256 index
    ) internal view returns (bool) {
        bytes32 hash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (index % 2 == 0) {
                hash = keccak256(abi.encodePacked(hash, proofElement));
            } else {
                hash = keccak256(abi.encodePacked(proofElement, hash));
            }

            index = index / 2;
        }

        return hash == root;
    }

可见verify函数缺少了leaf所在高度的检查

我们可以用树枝或者树根节点充当第四片叶子

这便是第一个漏洞。

漏洞2 assembly return tricks

assembly中 return(0, 0) 会结束当前调用,而非当前函数。

因此当g函数参数为 false 时,会当即结束 this.a(i, y);

最终 line29 x = i 会被无视。

aliyunCTF HappyTree WriteUP

通过肉眼执行代码,可发现传入4个leafs后,x == 3 && y == 4

漏洞3 solidty 优化器bug

该bug具体内容见俺写的另一篇文章

aliyunCTF HappyTree WriteUP

简单来说,优化器如果看到这种程序流,会觉得 x = 1 是句废话,并删除之。

对应到题目中,当g函数的参数为false时,第27行的 x = n 会被无视。

再肉眼执行一遍代码,x == 2 && y == 4

题目解决,呦西

PoC

["0x81376b9868b292a46a1c486d344e427a3088657fda629b5f4a647822d329cd6a","0x28cac318a86c8a0a6a9156c2dba2c8c2363677ba0514ef616592d81557e679b6","0x804cd8981ad63027eb1d4a7e3ac449d0685f3660d6d8b1288eb12d345ca2331d","0x9b1a0a45cfdc60f45820808958c1895d44da61c8f804f5560020a373b23ad51e"]
[
["0x28cac318a86c8a0a6a9156c2dba2c8c2363677ba0514ef616592d81557e679b6", "0x4a35f5bda2916fbfac6936f63313cee16979995b2409de59ceda0377bae8c486"],
["0x81376b9868b292a46a1c486d344e427a3088657fda629b5f4a647822d329cd6a","0x4a35f5bda2916fbfac6936f63313cee16979995b2409de59ceda0377bae8c486"],
["0x804cd8981ad63027eb1d4a7e3ac449d0685f3660d6d8b1288eb12d345ca2331d","0x9b1a0a45cfdc60f45820808958c1895d44da61c8f804f5560020a373b23ad51e"],
["0x4a35f5bda2916fbfac6936f63313cee16979995b2409de59ceda0377bae8c486"]
]
[0,1,2,4]

嘿嘿嘿,希望您喜欢这道题,如果有意见或建议,欢迎评论或点赞~

原文始发于liriu:aliyunCTF HappyTree WriteUP

版权声明:admin 发表于 2023年4月26日 上午11:22。
转载请注明:aliyunCTF HappyTree WriteUP | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...