案例-以太坊短地址攻击

作者: JouyPub | 来源:发表于2019-03-04 19:25 被阅读2次

    这种攻击方式的结果就是:让你瞬间由n个token变为n*256个token,穷屌丝变高富帅只需几分钟

    攻击原理:
    在ERC20代币标准中,有一个标准化的transfer函数

    function transfer(address _to, uint256 _value) returns (bool success)
    

    当我们真正调用transfer的时候,在EVM里实际上是在解析一堆ABI字符,ABI相关定义在这。

    比如我们这样调用transfer

    transfer(0xef181375f0d6d0b161134b6a0429f5f5016a41fa,200)
    

    那实际EVM看到的东西就是这样的

    0xa9059cbb000000000000000000000000ef181375f0d6d0b161134b6a0429f5f5016a41fa000000000000000000000000000000000000000000000000000001d1a94a2000
    

    排一下版的话就是这样


    image
    • 前面4字节是方法名的hash
    • 中间32字节是address _to(转账的目标地址),高位补0
    • 末尾32字节是uint256 _value(转账金额),高位补0,低位16进制存储
    • 可以通过etherscan查看这笔交易,我临时截下来的。

    短地址攻击
    你也看到了,在transfer的ABI里,金额在目标地址的后面,并且是紧贴着的。机遇就在这里!

    假如我们有一个如下地址0x1234567890123456789012345678901234567800

    如果我们把末尾的两个零去掉会发生什么??
    EVM依然会认为address _to是32位的,所以它会从_value的高位取0来补充。这意味着_value就少了一位!
    傻傻的EVM则会补上一个零来处理_value。所以你转账金额就翻了256倍

    那如果目标地址的末尾有多个零呢??!!

    攻击流程
    (1)生成一个末尾有零的地址,末尾的零越多越好(零太多的话小心交易所资金不足)
    (2)找到一个大交易所,确定其打币地址上有足够的资金,用虚假身份注册账号
    (3)向交易所充erc20币1个
    (4)从交易所提币到末尾有零的地址,填写地址的时候故意把末尾的零去掉
    (5)数钱
    (6)等待交易所工作人员打你电话,如果你用虚假身份注册,请忽略这点
    (7)等待交易所请你喝茶,喝茶时你悠闲的回复

    防御手段
    (1)交易所层面:检测用户输入地址位数是否合规
    (2)以太坊层面:节点发送交易前,校验函数参数位数是否合规
    (3)token合约层面:对transfer函数,检查len(msg.data) == 68,对其他函数同理

    欢迎订阅「K叔区块链」 - 专注于区块链技术学习
    博客地址:http://www.jouypub.com
    简书主页:https://www.jianshu.com/u/756c9c8ae984
    segmentfault主页:https://segmentfault.com/blog/jouypub
    腾讯云主页:https://cloud.tencent.com/developer/column/72548

    相关文章

      网友评论

        本文标题:案例-以太坊短地址攻击

        本文链接:https://www.haomeiwen.com/subject/rshwuqtx.html