PARADIGM CTF 2022题目分析(4)- MerkleDrop分析

WriteUp 2年前 (2022) admin
626 0 0

PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


CTF挑战已经结束一段时间,但其中许多题目中的安全漏洞和知识吸引着我们去研究和学习它,依旧存在难度和挑战。NUMEN实验室也一直关注区块链相关的各个方面的安全信息,也在努力和大家分享一些题解,本次为大家讲解merkledrop,如果有更好的方法和技巧,欢迎大家跟我们一起讨论。


MerkleDrop简介


Merkledrop 是一种流行的空投代币技术((即加密项目向社区发送免费代币以鼓励采用)。它们基于 Merkle 树的使用。由于这些数据结构的特性(即,每个非叶节点都是其子节点的哈希的二叉树),它们在空间使用和验证过程中特别有效。其中的叶子存储有关用户地址和他们有资格获得的代币数量的信息。然后将叶子成对分组并散列。它们的散列成对分组并再次散列,依此类推,直到有一个根散列。这样一棵树可以向任何人公开,并且仍然没有修改其数据的风险。通过散列保证一致性。

证明您有资格获得空投也很容易:

1.有一张带有您的地址和金额的叶子。

2.提供从叶子到根哈希的路径。具体来说,您需要证明树的每一层上的每一对中的其他哈希值。


题目分析:


1. MerkleDistributor.sol:

PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


分析本合约的主要可调用的函数为claim函数,领取合约下的代币。isClaimed是查询函数,查询叶子节点的领取状态。


2. Setup.sol:

PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


分析:我们可以看到构造函数中,merkleDistributor合约在创建后转了75000个代币进去。


题目要求

将合约下的代币全部领取,并且不是所有叶子节点都是领取状态。


解题分析:


解开这道题,我们只能调用merkleDistributor合约中的claim函数领取合约下的代币,又要有叶子节点没有领取。最开始小编看到这个两个条件,觉得还是很矛盾的。这个题提供了tree.json文件,里面有64个叶子节点的验证信息,包括提取地址,索引,金额和验证哈希,这些都是可以正常调用的。但直接使用这些信息可以提取完合约下的代币,但是所有叶子节点都提取了,并不能解开此题。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


通过继续分析题目,我们可以看到claim函数中amount是uint96,当得到 :is , is , is .这会产生64个字节,而64是一个好数字。如果我们再看一遍:

node:index uint256account addressamount uint96MerkleProof

PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


它连接两个哈希(每个哈希值为 32 个字节)并对其进行哈希处理。所以这里的输入也是64字节长,keccak256。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


如果其中一片叶子也是散列,所以我把所有叶子信息打包。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


这些序列中的每一个都是散列的,即左边的32个字节是一个散列,右边的32个字节是另一个散列。但是,前面有很多0的看起来不像真正的哈希值。右边的 32 个字节看起来更像哈希值。注意,它们中的每一个在大约相同的位置上都有多个00 – 这是由于填充了数量。

我们查看tree.json中如果有一个证据有类似的填充呢?


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


我们看到第37个叶子有类似信息,十六进制00000f40f0c122ae08d2207b的uint96数量为72033437049132565012603。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


1) 这时我们就可以整理提取参数,调用claim函数进行领取。我们将使叶子 37 的证明列表中的第一个证明本身成为叶子。我们可以将带有多个 00 作为输入的后半部分的证明传递给claim函数。

0xd48451c19959e2d9bd4e620fbe88aa5f6f7ea72a将是一个account,

0x00000f40f0c122ae08d2207b将是一个amount。

但我们需要index,它不能是任意数字,因为它用地址和金额进行哈希处理,而生成的哈希值与其他证明一起散列。证明是串联的,index也与地址和金额连接。而这个index就是叶子37的哈希,叶子被散列,然后它们的散列被成对分组并再次散列。因此,叶子 37 的哈希值与其证明数组中的第一个证明分组。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


合约中总共转入了75000*1e18个代币,刚刚提取了72033437049132565012603,还

剩余2966562950867434987397,十六进制为0xa0d154c64a300ddf85,我们

在tree.json中寻找有没有这个数量的叶子节点。答案是有的,index为8的叶子节点。




PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


2) 然后再继续调用claim函数,将参数信息传入就可以提取剩余的代币。


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


总结


这道题小编在解的时候也是走了很多弯路,要合理的利用题目中所给的所有信息和数据,不然很难解开这道题,如果大家有更好的方法和技巧,欢迎一起讨论。NUMEN实验室会持续关注区块链安全!


PARADIGM CTF 2022题目分析(4)- MerkleDrop分析


原文始发于微信公众号(Numen Cyber Labs):PARADIGM CTF 2022题目分析(4)- MerkleDrop分析

版权声明:admin 发表于 2022年8月31日 下午7:25。
转载请注明:PARADIGM CTF 2022题目分析(4)- MerkleDrop分析 | CTF导航

相关文章

暂无评论

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