Go-Ethereum
如何使用 Truffle 和 testRPC 模擬 DAO 攻擊
我想模擬DAO遞歸攻擊。您能否定義使用 TestRPC 使用 Truffle 模擬攻擊的步驟。
- 創建您的契約
DAOHack.sol
並將其保存在契約 文件夾中。- 創建
2_deploy.js
遷移文件並將其儲存在遷移文件夾中。- 在 中指定網路參數
truffle.js
。- 通過執行編譯合約
truffle compile
。ganache-cli
在 中指定的埠上執行truffle.js
。- 通過執行以下命令部署合約以測試網路:
truffle migrate
.如果您稍後需要任何智能合約地址,您可以在此步驟中複製它們。
接下來,您可以進行測試或創建小應用程序。
- 在測試的情況下,您必須創建測試並執行
truffle test test/DAOHack.js
.- 描述如何創建應用程序太寬泛了,切入正題,當應用程序準備就緒時,您只需像
lite-server
.如需更詳細的解釋,請考慮深入了解Truffle 文件。
請注意,
TestRPC
現在是Ganache-cli
.
關於 DAO 黑客如何工作的一個很好的概念證明是 https://ethernaut.zeppelin.solutions/level/0xf70706db003e94cfe4b5e27ffd891d5c81b39488
有幾個步驟可以重現這個。
你需要一份這樣的契約
pragma solidity ^0.4.18; contract Reentrance { mapping(address => uint) public balances; function donate(address _to) public payable { balances[_to] += msg.value; } function balanceOf(address _who) public constant returns (uint balance) { return balances[_who]; } function withdraw(uint _amount) public { if(balances[msg.sender] >= _amount) { if(msg.sender.call.value(_amount)()) { _amount; } balances[msg.sender] -= _amount; } } function() payable {} }
然後你需要創建一個合約賬戶,將資金發送給
Reentrance
合約。這將是你的利用點。您的契約需要能夠:
- 將資金發送到
Reentrance
,具體donate()
以 Ether 值呼叫。此值將保存在您的地址中withdraw()
具有再次呼叫的預設應付功能- 呼叫
withdraw()
功能開啟Reentrance
擁有呼叫的預設應付函式
withdraw()
會創建一個無限循環。這是一個無限循環,但當所有氣體用完時它會停止。因此,您發送的氣體越多,能夠迭代的循環就越多,從而提取更多資金。因為 gas 用完了,所以餘額永遠不會更新,但 Ether 仍然發送。