专栏名称: BNB48Club
世界充满Bug,【往南么】为你指出方向。
目录
相关文章推荐
度房苏州  ·  控规调整!涉及吴江太湖新城! ·  昨天  
最江阴  ·  1000万!无锡再出一位大富翁 ·  2 天前  
扬州广播电视台  ·  泰州发现大油田! ·  2 天前  
扬州广播电视台  ·  泰州发现大油田! ·  2 天前  
51好读  ›  专栏  ›  BNB48Club

简单解释一下BatchTransfer漏洞

BNB48Club  · 公众号  ·  · 2018-04-26 00:59

正文

标准的的以太坊ERC20代币转账程序是这样的:


需求:地址a 转N个代币 到 地址b

1. 检查地址a的代币余额是否大于等于N,如果是继续,否则退出

2. 地址a上的代币扣掉N,地址b上的代币增加N


逻辑简单,基本没有漏洞。


BEC的合约在编写的时候在此基础之上增加了一个批量转账函数:


需求:地址a 给b1 b2 b3 b4...直到bM共M个地址,每个转N个代币

  1. 检查地址a的代币余额是否大于等于N乘以M,如果是继续,否则退出

  2. 地址a上的代币扣掉N乘以M,b1到bM每个地址代币增加N


这一加,就加出问题来了。

程序语言中的变量是有精度的,换句话说是有范围的,比如以太坊的Solidity语言中常用的uint256就是无符号256位整数,最大可表示的整数是2^256-1。当数字比这个还大怎么办?就存不下了,俗称 溢出 。Solidity里,溢出后就当0处理了。


在上面这个批量转账函数里面,只要精心选择N和M,使得N不溢出,但是M个N溢出,就会发现第一步的检查里只要求a的代币余额大于等于0——当然永远满足,这样第二步给每个地址增加N个代币的操作就得以执行。







请到「今天看啥」查看全文


推荐文章
度房苏州  ·  控规调整!涉及吴江太湖新城!
昨天
最江阴  ·  1000万!无锡再出一位大富翁
2 天前
扬州广播电视台  ·  泰州发现大油田!
2 天前
扬州广播电视台  ·  泰州发现大油田!
2 天前
心情聊伤话  ·  不结婚,我也愿意和你睡一辈子!
7 年前
程序人生  ·  Tubi TV 还在招募 Sr. Data Engineer
7 年前
捉妖擒龙帝  ·  反弹?你们先干,我再看看!
7 年前
泽熙投研  ·  今日推荐
7 年前