惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
MyScale Blog
MyScale Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium
MongoDB | Blog
MongoDB | Blog
I
InfoQ
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Help Net Security

博客园 - 幽州散人

SQL优化案例 synchronized 为啥会让虚拟线程卸载失效 主线任务和使命 温州3日之旅 CompletableFuture + 异步Servlet:同步的姿势、异步的效果 Snowflake雪花算法与发号器的应用 windows Java 幽灵转发壳进程 也谈MySQL limit offset深翻页问题 SHOW SESSION STATUS 与 Handler 变量 MySQL 5.7 Profiles 执行性能分析 MySQL临时表与文件排序 MySQL 5.7 MRR多范围读优化 MySQL 5.7 ICP索引条件下推优化 MySQL符合索引与最左前缀原则 从I/O 的物理成本理解回表和索引覆盖 第4个电瓶以及补漆 Flink原理:并行度与keyGroup桶 什么是数字批发银行 Java虚拟线程(三)实现原理 Java虚拟线程(二) Java虚拟线程(一) 大模型推理层服务化架构 传奇调查员之路:理智值-99,但我必须听懂深渊的语言 js里调用智能合约读/写函数的方法的区别 字节与其16进制字符表示转换的bug Redisson分布式锁 交易心得 DexScreener接口初探 某安全软件跑飞了。。 Ed25519算法签名与验签的Java实现
ERC20短地址攻击
幽州散人 · 2025-10-21 · via 博客园 - 幽州散人

今天重看USDT合约的代码,在BasicToken里有如下代码


    modifier onlyPayloadSize(uint size) {
        require(!(msg.data.length < size + 4));
        _;
    }

    function transfer(address _to, uint _value) public onlyPayloadSize(2 * 32) {
       // ......
    }

}

modifier onlyPayloadSize是确保payload是68,意思是前4字节函数选择器(函数签名),后面两个参数每个占32字节,一共是4+32+32=68字节,必须是满足这个长度。详见如下表:

部分 含义 长度(字节)
函数选择器(keccak256("transfer(address,uint256)") 前4字节) 4
_to 参数(address,占 32字节槽,右对齐,左补零) 32
_value 参数(uint256,占 32字节) 32
合计 68 字节

然后,这个是为了预防所谓的短地址攻击

具体短地址攻击手法:
1、攻击者构造了0x1111111111111111111111111111111111111100地址,并掌握私钥。
2、攻击者故意将0x11111111111111111111111111111111111111作为第一个参数 _to,然后第二个参数 _value正常传个金额,比如00000000000000000000000000000000000000000006765c793fa10079d0000000
3、将上述三个部分组装成 calldata传给一个 有缺陷的服务,这个服务提交给EVM执行的时候,会按照如下方式进行参数提取,前4字节不变,_to参数会提取0x1111111111111111111111111111111111111100,但是结尾的“00”实际上是截取的 _value参数的最开头的“00”,然后提取 _value的时候因为前边被截取了“00”会发现少了1个字节,所以会在右侧自动补齐“00”,最后 _value变成了000000000000000000000000000000000000000006765c793fa10079d000000000,相当于16进制左移了两位,变大了256倍!
4、这样攻击者成功的提取了256倍的金额到0x1111111111111111111111111111111111111100地址!

参考:https://ethbook.abyteahead.com/ch10/shortattack.html