嘿,我有一个关于重新进入的问题,我知道逻辑,但考虑到交易时间以及a和B中的两个函数都在下一行上,攻击者为什么能在余额设置为0之前再次提款
重新进入
假设我们有两份合同。持有一定以太币的目标合约属于攻击者合约。现在攻击者合约想提取其资金
攻击者合约有两个功能:fallback
和withdraw
// this gets triggered when ether is receive
fallback(){
A.withdraw()
}
attack(){
A.withdraw()
}
假设攻击者合约调用attack
函数。这将调用目标合同内的withdraw
:
目标合同:
withdraw(){
require balance>0
send ether
// before balance gets updated attacker's fallback triggers another withdraw
// send function will give the control to the attacker's contract
set balance of attacker =0
}
现在,目标合约将向攻击者的合约发送ether
。当它这样做时,内部攻击者的契约fallback
函数被触发。每次接收到乙醚时,都执行fallback
。我详细解释了的后备功能
现在攻击者的合约被以太接收,并立即调用目标合约内的withdraw
。所以目标合约的withdraw
函数是循环的,直到目标合约的余额达到0
如果合同使用call, send or transfer
,可能导致控制流到攻击者合约,因为这些函数为回退函数委派了足够的气体。一旦控制权被传递给攻击者的合约,目标合约的状态就会不完整。目标合同失去了控制权。
防止重入攻击