嗨嗨嗨嗨
这次aliyunCTF的Blockchain,考了三个知识点
- MerkleTree验证
- assembly中的return trick
- solidity 优化器漏洞
如果您感兴趣,可以去aliyunCTF尝试一下,比赛结束后7天内,题目环境不会关闭哦
题目
Public的function只有isSolved
和 b
isSolved
是本题目标,当 x == 2 && y == 4
时,解题成功。
漏洞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
会被无视。
通过肉眼执行代码,可发现传入4个leafs后,x == 3 && y == 4
漏洞3 solidty 优化器bug
该bug具体内容见俺写的另一篇文章
简单来说,优化器如果看到这种程序流,会觉得 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
相关文章
暂无评论...