// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleBank {
// 构造函数,允许在初始化时转入以太币
constructor() payable {}
struct Signature {
bytes32 hash;
uint8 v;
bytes32 r;
bytes32 s;
}
//校验签名
function verifySignatures(Signature calldata sig) public{
//ecrecover 是内置函数,用于从签名中恢复原来的值
require(
//比较调用者地址和签名里恢复的地址是否一致
msg.sender == ecrecover(sig.hash, sig.v, sig.r, sig.s),
"Invalid signature"
);
}
//提现,传入签名数组(恢复地址)
function withdraw(Signature[] calldata sigs) public{
//开始循环
for (uint i = 0; i < sigs.length; i++) {
Signature calldata signature = sigs[i];
//校验地址是否一致
verifySignatures(signature);
}
//给调用者发送1ether
payable(msg.sender).transfer(1 ether);
}
receive() external payable {}
}
Signature calldata signature = sigs[i];
verifySignatures(signature);
payable(
msg.sender).transfer(
1 ether);
成功的从合约里进行提现最大数量的ETH
其他的合约代码出现的类似的问题
修复建议:
1、禁止传入一个空的数组,检查传入的数组是否为空。大概的意思是require(
sigs.length
> 0
2、不要使用循环对比了,直接传入一个签名对比即可
https://www.yuque.com/iceqaq
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论