Ich möchte den rekursiven DAO-Angriff simulieren. Können Sie bitte die Schritte zum Simulieren des Angriffs mit Truffle mithilfe von TestRPC definieren.
DAOHack.sol
und speichern Sie ihn im Vertragsordner .2_deploy.js
Migrationsdatei und speichern Sie sie im Migrationsordner .truffle.js
.truffle compile
.ganache-cli
dem in angegebenen Port ausführen truffle.js
.truffle migrate
.Wenn Sie später eine Adresse von Smart Contracts benötigen, können Sie diese in diesem Schritt kopieren.
Als nächstes können Sie entweder einen Test machen oder eine kleine App erstellen.
truffle test test/DAOHack.js
.lite-server
.Für eine detailliertere Erklärung sollten Sie in die Truffle-Dokumentation eintauchen .
Beachten Sie, dass TestRPC
dies jetzt der Fall ist Ganache-cli
.
Ein sehr guter Proof of Concept, wie der DAO-Hack funktioniert, ist dieser https://ethernaut.zeppelin.solutions/level/0xf70706db003e94cfe4b5e27ffd891d5c81b39488
Es gibt ein paar Schritte, um dies zu reproduzieren.
Sie brauchen einen Vertrag wie diesen
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 {}
}
Dann müssen Sie ein Vertragskonto erstellen, das Gelder an den Reentrance
Vertrag sendet. Dies wird Ihr Angriffspunkt sein.
Ihr Vertrag muss Folgendes können:
Reentrance
, insbesondere rufen Sie donate()
mit Ether-Wert an. Dieser Wert wird für Ihre Adresse gespeichertwithdraw()
Haben Sie eine standardmäßige kostenpflichtige Funktion, die erneut aufruftwithdraw()
einReentrance
Wenn Sie die standardmäßige kostenpflichtige Funktion haben, die aufruft, withdraw()
entsteht eine Endlosschleife . Es ist eine Endlosschleife, aber sie stoppt, wenn das gesamte Gas verbraucht ist. Je mehr Gas Sie senden, desto mehr Schleifen können iterieren und somit mehr Geld abheben.
Da das Gas aufgebraucht ist, wird die Bilanz nie aktualisiert, aber der Ether bleibt gesendet.
Daniel Luca CleanUnicorn
ivicaa
Daniel Luca CleanUnicorn