HTB Blockchain Challenge - Portal Nonsense
Portal Nonsense
Portal.sol
1 | // SPDX-License-Identifier: UNLICENSED |
分析
- 這題很明顯是要透過
delegatecall
呼叫外部合約來改變自身合約的變數 - 但這邊有一個問題在於,我們要如何產生一個合約地址是destinations裡面的其中之一
- 對於一般帳戶而言,合約的地址是取決於 deployer address 與 nonce
- 因此我們可以透過城市計算出需要部署多少個合約,可以得到我們目標的合約地址
計算合約地址
- 可以使用 eth-util或是 foundryup 的 cli計算
cast compute-address {deployer} --nonce {nonce}
1 | import subprocess |
- 只要我們生成130次合約,就可以取得目標地址
Exploit
- 利用 delegatecall 來改變數
1 | // SPDX-License-Identifier: UNLICENSED |
- generate 130
1 | for i in range(131): |
-
cast send --rpc-url http://167.99.85.216:30676/rpc --private-key {{private key}} 0xACef632826fb9d4EF70cB70640b5F56b7474B3a9 "createPortal(string)" "orcKingdom"
-
cast call --rpc-url http://167.99.85.216:30676/rpc --private-key {{private key}} 0xfD730FDDbD5b98471b7a0fE78d2CB0Fd0E5454BA "isSolved()"
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments