Go-Ethereum

如何使用 Truffle 和 testRPC 模擬 DAO 攻擊

  • March 10, 2018

我想模擬DAO遞歸攻擊。您能否定義使用 TestRPC 使用 Truffle 模擬攻擊的步驟。

  1. 創建您的契約DAOHack.sol並將其保存在契約 文件夾中。
  2. 創建2_deploy.js遷移文件並將其儲存在遷移文件夾中。
  3. 在 中指定網路參數truffle.js
  4. 通過執行編譯合約truffle compile
  5. ganache-cli在 中指定的埠上執行truffle.js
  6. 通過執行以下命令部署合約以測試網路: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 仍然發送。

引用自:https://ethereum.stackexchange.com/questions/42252