智能合约之短地址攻击

2023-11-10

在了解以太坊智能合约短地址攻击之前,先要简单了解一下以太坊代币ERC-20 TOKEN 的一些基础知识。ERC(EthereumRequest for Comment)即以太坊通用征求意见协议,开发者可以通过提交EIP(Ethereum Improvement Proposal以太坊改进建议),向以太坊社区提交新的ERC标准提案。ERC-20是整个加密社区中的所有标准中名气最大的,而且大多数基于以太坊平台发布的token都基于ERC-20协议。ERC-20 TOKEN标准中,提供了一些基础函数,如下:

// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
pragma solidity ^0.4.21;


contract EIP20Interface {
    /* This is a slight change to the ERC20 base standard.
    function totalSupply() constant returns (uint256 supply);
    is replaced with:
    uint256 public totalSupply;
    This automatically creates a getter function for the totalSupply.
    This is moved to the base contract since public getter functions are not
    currently recognised as an implementation of the matching abstract
    function by the compiler.
    */
    /// total amount of tokens
    uint256 public totalSupply;

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) public view returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) public returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);

    /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of tokens to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint256 _value) public returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) public view returns (uint256 remaining);

    // solhint-disable-next-line no-simple-event-func-name
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

下面来简单介绍一下各个函数的功能:
balanceOf() :查询_owner地址持有的Token数量
transfer() :从msg.sender地址发送_value Token到_to地址
transferFrom():从_from的地址发送_value Token到_to地址
approve():Token所有者可以调用这个函数授权spender代表它使用value数量的token
allowance():用来查看owner给spender的token剩余额度

以上是ERC-20 TOKEN实现的一些基础函数,在进行Token转账时,最常用到的是 transfer() 函数,下面将举个例子讲解该函数实现Token转账的方法。比如向0x15022eCbc4Fc993d1Fd179A41F7b985fA9C0b787地址发送一个Token,其最终向EVM提交的数据制作过程如下:
function transfer(address to, uint tokens) public returns (bool success);
其sha3的前4个字节数据为:a9059cbb

Token转账的地址为32字节,高位用0填充:
00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b787

转账代币的数量为32字节,1个TOKEN:
00000000000000000000000000000000000000000000000000000000000000001

最终向EVM移交的数据为:

a9059cbb00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b78700000000000000000000000000000000000000000000000000000000000000001

以上是对ERC-20协议的TOKEN以及转账数据生成过程的介绍,接下里就来介绍一下重点,短地址攻击的过程。先看一个简单的示例代码:

pragma solidity ^0.4.21;

contract Short AddressAttack{
	 mapping(address => uint) public balances;
	 event transfer(address indexed _from,address indexed  _to, uint256 _value);
	
	function AddressAttack() {
		balances[msg.sender] = 1000;
	}
	
	function transfer(address _to, uint256 _value) public returns (bool success){
		if(balances[msg.sender] <  _value)  return false;
		if(_value <  0)  return false;
		
		balances[msg.sender]  -=  _value;
		balances[ _to]  +=  _value;
		event transfer(msg.sender,_to,_value);
		return ture;
	}
}

其实短地址攻击,就是转账接受方的地址最后一个字节为0(其实最后结束以字节0结尾的字节数越多越好),在转账的时候,恶意去掉接收方地址最后的0字节数据,让EVM自己自动去补全,攻击过程如下:
调用函数前4个字节:a9059cbb
转账地址:00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b700
转账数额:00000000000000000000000000000000000000000000000000000000000000001

如果恶意将转账地址的最后一个字节0去掉,其数据如下:
调用函数前4个字节:a9059cbb
转账地址:00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b7
转账数额:00000000000000000000000000000000000000000000000000000000000000001
生成的交易数据:

a9059cbb00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b700000000000000000000000000000000000000000000000000000000000000001

数据到EVM中解析进行数据还原:

调用函数前4个字节:a9059cbb
转账地址32字节:00000000000000000000000015022eCbc4Fc993d1Fd179A41F7b985fA9C0b700
转账数额32字节:000000000000000000000000000000000000000000000000000000000000001
EVM会依据规则对数据进行解析,上述你会发现,转账地址最后两位由转账数额进行替补上,那么转账数额少一个字节怎么处理呢?
在EVM中有自动补全的机制,少多少字节全部填充0,j填充后的转账金额如下:
转账数额32字节:00000000000000000000000000000000000000000000000000000000000000100

到这里发现没有,本来仅仅转账1个TOEKN,经过攻击后转账256个TOKEN,这个就是短地址攻击的原理。

针对这个漏洞,说实话以太坊有不可推卸的责任,因为EVM并没有严格校验地址的位数,并且还擅自自动补充消失的位数。此外,交易所在提币的时候,需要严格校验用户输入的地址,这样可以尽早在前端就禁止掉恶意的短地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能合约之短地址攻击 的相关文章

  • 智能合约(一)————智能合约入门

    1 智能合约的基本组成 1 1 程序版本 1 2 合约声明 1 3 状态变量 1 4 合约方法 在这里constant相当于他声明这个局部变量不能更改 但是他并没有实际作用 实际就只是警示作用 2 地址adress address bala
  • 理解不同加密币的要点(一)—— 共识机制

    一 加密货币分类 一 价值层面 与实体资产绑定的代币 为了因应市场需求而生 与实体资产做挂钩的代币 也就是我们说的稳定币 例如与美元做挂钩的USDT TUSD PAX与USDC等 仰赖网络共识的代币 代币价值仰赖网路上市场共识的代币 基本上
  • 为什么bytes32等于uint256

    先说1byte等于8个字节 bytes32则等于8 32 256个字节 接着uint8同样等于8个字节 uint256即8个字节的32倍 256 8 32 因此看到byteX和uintY时 如果X 8 Y 意味着byteX uintY
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • 以太坊开发者工具的最新清单

    以太坊开发者工具的最新终极清单 用于在以太坊上开发应用程序的可用工具 组件 框架和平台的指南 对于任何开发者 无论你是一个睁大眼睛的Web3新手还是一个头发灰白的OG加密无政府主义技术霸主 Github都是你的朋友 特别是ConsenSys
  • 在BSN武汉链上部署solidity智能合约(转载)

    分享一篇不错的关于武汉链的入门技术文章 原文连接 在BSN武汉链上部署solidity智能合约 登链社区 区块链技术社区 在BSN武汉链上部署solidity智能合约 BSN简介区块链服务网络 Blockchain basedService
  • 使用 sCrypt 实现一个简单的 NFT 合约

    我们之前的token方案针对的是可替换 fungible 的 token 这里来看看另一种方案如何实现 NFT non fungible token 合约 这类 token 可以代表独一无二的和不可分割的资产 比如房地产和收藏品 概览 与可
  • MetaMask 添加BSC、Polygon网络配置

    打开浏览器 点击MetaMask插件 选择网络 点击弹窗中的 Add Network 按钮 添加各网络配置如下 1 BSC Binance Smart Chain 主网 key value 网络名称 Network Name Binance
  • Eos离线签名PHP代码

    EOS区块链的钱包服务器Keosd 提供了sign transaction开发接口 允许开发者进行交易签名 但是 如果我们希望自己管理密钥而不是交给keosd管理 应该如何在PHP代码中实现交易的离线签名功能 答案是使用 EosTool 这
  • 这篇文章,让你了解ERC-1155 多代币标准协议

    文章目录 ERC1155 介绍 多代币标准 前提条件 代币标准 ERC 20 ERC 721 构建 ERC1155 代币合约 ERC 1155 的功能和特点 批量传输 批量余额 批量审批 接收钩子 支持非同质化代币 安全转账规则 ERC11
  • 搭建第一个Dapp应用(4)——搭建SmartDev-Scaffold——2021.5.3

    搭建第一个Dapp应用 4 搭建SmartDev Scaffold 一丶环境配置 Java gt JDK 1 8 Solidity 0 4 25 Git 下载安装包需要使用Git Gradle 大于6 小于7 使用gradle7会报错 二丶
  • 以太坊如何通过构建智能合约来销售商品?

    如何通过构建以太坊智能合约来销售商品 这是个问题 毫无疑问 比特币已经改变了我们看待和理解什么是金钱 价值以及最近由智能合约产生的所有权的方式 这很有趣 因为几乎每个人都听说过它或加密货币 来自许多业务领域的人 不仅仅是我们 IT工作者 在
  • Solidity 合约安全,常见漏洞(第三篇)

    Solidity 合约安全 常见漏洞 第三篇 ERC20 代币问题 如果你只处理受信任的 ERC20 代币 这些问题大多不适用 然而 当与任意的或部分不受信任的 ERC20 代币交互时 就有一些需要注意的地方 ERC20 转账扣费 当与不信
  • 【元宇宙】智能手机万岁

    凭借出色的新设备 我们很快就能进人元字宙 想象这样的情景是很趣的 但是 至少到21世纪20年代 元宇宙时代的大多数设备很可能是我们已经在使用的设备 AR 和 VR 设备不仅面临重大的技术 财务和体验障碍 而且它们在上市后同样会面临币场反响冷
  • python 之 web3 与智能合约的交互、编译等使用

    一 背景 web3 py是一个用于与以太坊交互的 Python 库 它常见于去中心化应用程序 dapps 中 帮助发送交易 与智能合约交互 读取块数据以及各种其他用例 最初的 API 源自Web3 js Javascript API 但后来
  • Truffle测试框架

    Truffle测试框架 Truffle 有一个标准的自动化测试框架 让你可以非常方便地测试您的合约 这个框架允许您以两种不同的方式编写简单可控的测试 1 在 JavaScript中 用于执行来自外部世界的合约 就像您的应用程序一样 2 在
  • nodejs以太坊Dapp开发中文资料收集(精选版)

    区块链技术是趋势 会Nodejs 想做区块链相关 选择了以太坊这个平台 网上资料虽然多少能搜到 但是鱼龙混杂 重复错误百出 不够系统 在几天的搜寻筛选之后 整理了以下中文以太坊智能合约开发资料 有不足或者补充的请留言 互相交流共同进步 1
  • OpenZeppelin集成Truffle编写健壮安全的合约

    原文 http truffleframework com tutorials robust smart contracts with openzeppelin 因为智能合约往往涉及金钱 保证Soldity代码没有错误 以及足够的安全是非常根
  • 以太坊构建DApps系列教程(一):应用程序规则和区块链设置

    这将是一个如何使用以太坊区块链构建去中心化应用程序DApps的系列教程 第一篇教程重点介绍应用程序的规则和功能以及设置私有区块链 展示在使用或不使用DAO和应用程序的情况下如何构建自己自定义的以太坊代币 我们要构建3件事 自定义代币 使用代
  • 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)

    文章目录 四 智能合约的开发和WeBASE合约IDE的使用 一 实验概述 二 实验目标 三 实验环境及建议 四 实验步骤 4 1 启动Webase 4 2 智能合约开发 4 2 1 合约功能设计 4 2 2 存证合约开发 4 2 3 工厂合

随机推荐

  • 使用jsPlumb制作流程图设计器

    jsPlumb是一个比较强大的绘图组件 它提供了一种方法 主要用于连接网页上的元素 在现代浏览器中 它使用SVG或者Canvas技术 而对于IE8以下 含IE8 的古董浏览器 则使用VML技术 项目主页 http jsplumbtoolki
  • PCL 常用小知识

    目录 零 保存点云 一 时间计算 二 已知需要保存点的索引 从原点云中拷贝点到新点云 三 删除无效点 四 pcl PointCloud Ptr和pcl PointCloud的两个类相互转换 五 计算点云中心点 六 将vector型索引转换成
  • scikit-learn 逻辑回归--调参

    代码笔记 from sklearn linear model import LogisticRegression as LR from sklearn datasets import load breast cancer import nu
  • CTFshow web15

    ctf show 萌新模块 web15关 这一关是代码执行漏洞 需要灵活的运用PHP的命令执行函数 在上一关的基础上又过滤了 gt 关键字 看起来已经没啥思路了 但仔细一看 它居然取消了对分号 的过滤 这样一来就好办了 继续上一关的曲线救国
  • IDEA中打jar包的方式

    在讲这两种方式之前 我们先来说明一下什么是java中的jar文件 jar Java Archive File 翻译过来就是java的档案文件 它其实也类似于我们windows下的zip文件 唯一的区别就是在 JAR 文件的内容中 包含了一个
  • opencv学习--图像处理基础

    将图片处理为灰度图 import os import re import cv2 from PIL import Image import numpy as np import matplotlib pylab as pylab img c
  • css公共样式总结(持续总结)

    flex display flex align center align items center justify between justify content space between justify center justify c
  • java基础(一)-虚拟机和第一个命令

    虚拟机 用 Java 语言编写的程序由 Java 虚拟机 JVM 来执行 JVM 是一个特殊的程序 它知道如何执行用 Java 语言编写的程序 并且它的命令列表涵盖范围很大 比如 System out println 你以为我会说虚拟机是由
  • WebGL简介

    WebGL简介 前言 1 WebGL简介 1 1 WebGL概述 1 2 WebGL程序的结构 1 3 WebGL和OpenGL 2 着色器语言 2 1 顶点着色器 2 2 片元着色器 3 webGL绘制一个点 4 webGL渲染过程 前言
  • 模板类的特例化(具体化)

    模板的基础知识 模板的实例化 模板并不是真正的函数或类 它仅仅是编译器用来生成函数或类的一张 图纸 模板不会占用内存 最终生成的函数或者类才会占用内存 由模板生成函数或类的过程叫做模板的实例化 相应地 针对某个类型生成的特定版本的函数或类叫
  • 【Flask学习】2.1模板之渲染

    1 模板概念 观察之前的demo程序 1个视图函数的响应是诸如 h1 Hello everyone h1 的html文本 但是常规的视图函数一般经过业务逻辑处理 再生成响应返回给客户端 这两个过程叫做业务逻辑和表现逻辑 目前来看 demo中
  • 压力测试脚本,并发发送请求

    import base64 import os import urllib import numpy as np import requests time json threading random class Presstest obje
  • Java实现五子棋对战小游戏【完整版】

    个人简介 个人主页 陈橘又青 博客记录心情 代码编写人生 如果文章对你有用 麻烦关注点赞收藏走一波 感谢支持 欢迎订阅我的专栏 Java进阶之路 带你入门Java 从0到1 Java全栈编程 带你项目实战 掌握核心 前言 大家好 今天用sw
  • ios 设备的移动端页面 光标错位

    1 这个问题遇到好多次了 经常是上下错位 原因是在input 获取焦点以后 键盘弹出后 页面网上移动 但是光标停留在了以前的位置 如果页面不复杂 可以在body上添加 position fixed 但是这样会引起页面失去滚动能力 目前只能是
  • iOS开发实战-仿小红书App开发-1-App创建与Git

    1 新建项目 2 添加Git仓库 添加自己的gitHub账号 3 Token获取方式 Settings Developer Settings 获取个人Token 填写相关内容 得到Token后复制它 拿到Xcode中登录 填写相关信息 创建
  • Qt次线程向主程序发送信号收不到的问题

    问题的提出 Qt次线程向主程序发送信号收不到 信号槽connect返回也是true 排查原因如下 信号或槽函数中的参数用到了自定义类型 如果要在Qt信号槽中使用自定义类型 需要注意使用qRegisterMetaType对自定义类型进行注册
  • 【Python】用xpath爬取网页文字保存到txt中(含有文字解码代码)

    本文收录于 python学习笔记 专栏 这个专栏主要是我学习Python中遇到的问题 学习的新知识 或总结的一些知识点 我也是初学者 可能遇到的问题和大部分新人差不多 在这篇专栏里 我尽可能的分享出我学习的内容 专栏在持续更新中 hello
  • xctf php2

    好久没打CTF了 随便做一道练练手 知识点总结 phps可查看网页源代码 对于url编码服务器会自动解码一次 试着访问一下index php页面 回显正常 访问index phps可以查看页面源码 下面分析一下 参数id不能等于admin
  • JS逆向-常见反调试之“无限Debugger”,怎么解决?

    前言 本文是该专栏的第34篇 后面会持续分享python爬虫干货知识 记得关注 首先来说下反调试 一般将反调试理解为 影响正常调试的都属于反调试 其大致包括压缩混淆加密 无限debugger 控制台状态检测 蜜罐以及内存爆破 而无限debu
  • 智能合约之短地址攻击

    在了解以太坊智能合约短地址攻击之前 先要简单了解一下以太坊代币ERC 20 TOKEN 的一些基础知识 ERC EthereumRequest for Comment 即以太坊通用征求意见协议 开发者可以通过提交EIP Ethereum I