智能合约之短地址攻击

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(使用前将#替换为@)

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

  • 一、Conflux 网页钱包创建

    相信每一位新加入的小伙伴都有一个疑问 去中心化的钱包到底是什么 如何拥有一个自己钱包 如何使用这个钱包吧 下面我将会为大家讲解如何创建钱包 导入钱包 使用钱包三个方面讲解下 一 创建钱包 首先大家进入钱包网站登录页面 大家可以将该网址收藏
  • conflux.web3j.RpcException:data = “\“network prefix inconsistent in from(net999) and to(cfxtest)\““

    java conflux sdk报错 SLF4J Failed to load class org slf4j impl StaticLoggerBinder SLF4J Defaulting to no operation NOP log
  • Solidity transfer,call和send 的区别

    address transfer throws on failure forwards 2 300 gas stipend not adjustable safe against reentrancy should be used in m
  • 使用web3 部署智能合约

    CentOS 7 环境 web3安装 及 对象的创建 m0 47233175的博客 CSDN博客https blog csdn net m0 47233175 article details 121960931还未安装web3环境 请参照以
  • Web3 用例全解析:传统品牌加速进入 Web3 的原因?

    Web3 有能力彻底改变品牌和客户相互联系的方式 许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度 这是传统社交媒体和电子商务渠道根本无法做到的 NIKE Panini 和 Vodafone nbsp 是最早认识到 N
  • Solidity 合约安全,常见漏洞 (下篇)

    Solidity 合约安全 常见漏洞 下篇 Solidity 合约安全 常见漏洞 上篇 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数 区块链需要是完全确定的 否则分布式节点将无法达成关于状态的共识 因为它们是完全确定的 所
  • 以太坊开发者工具的最新清单

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

    分享一篇不错的关于武汉链的入门技术文章 原文连接 在BSN武汉链上部署solidity智能合约 登链社区 区块链技术社区 在BSN武汉链上部署solidity智能合约 BSN简介区块链服务网络 Blockchain basedService
  • 带你玩转以太坊智能合约的”Hello World“

    学习目标 使用solidity语言撰写智能合约 开发前的准备 Ubuntu环境下Atom编辑器安装及使用 安装所需工具 安装nvm 安装node 安装npm 启动testrpc 建立项目 目录结构 新建HelloWorld合约 代码说明 编
  • 你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

    文章目录 课前小差 聚沙成塔 社会价值 DAO是什么 国产化 商业化回报 写在最后 课前小差 哈喽 大家好 我是几何心凉 这是一份全新的专栏 唯一得倒CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家
  • CROSS使用说明书 发行和拍卖NFT完整攻略

    鉴于目前去中心化NFT发行和拍卖平台CROSS是英文版本 对部分中国区用户存在操作困难 为了方便投资者和NFT爱好者能及时了解CROSS的相关信息和使用流程 现在CyberVein推出了更加详细的CROSS完整版教程 若还存有疑问 可添加中
  • stop容器

    docker ps 查看所有正在运行容器 docker stop containerId containerId 是容器的ID docker ps a 查看所有容器 docker ps a q 查看所有容器ID docker stop do
  • 从 sCrypt 智能合约中访问区块链数据(5)

    在本系列前几部分奠定的基础上 在本文中将演示如何在 BSV 中实现相对锁定时间 而无需新的操作码 OP CheckSequenceVerify 时间锁 时间锁会限制某些 BSV 的支出 直到指定的未来时间或区块高度 有两种类型的时间锁 绝对
  • 10分钟内用Ezo和Python构建以太坊Oracle

    上一篇 我写了用Web3 js构建以太坊Oracle 这个练习给了我一些新的Web3 js 1 0版本知识 许多新的好东西可供选择而且使用它实现一个简单的oracle非常容易 但是 显然必须有更好的方法 Instant Oracles 只需
  • 使用 sCrypt 实现数独游戏合约

    我们在 BSV 区块链上实现了一个数独游戏智能合约 利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链 因为求解数独问题的计算工作量会随着其行列数快速增长 实际上它也是一个 NP 完全 问题 不过我们可以借由 sCrypt
  • 整数溢出的漏洞危害和预防

    智能合约作为区块链2 0的代表技术 适应于区块链去中心化 分布式的特点 具有独立运行 不可篡改的优良特性 可用于实现包含金融工具在内的各类分布式应用 开发者可以自行定义交易逻辑并开发代码发布到链上 合约代码在矿工节点的虚拟机环境 如EVM
  • 和数集团聚焦区块链人才培养推动数字经济场景落地

    随着互联网时代的不断推进 全球经济结构已呈现多元化形态 尤其是大数据 云计算 人工智能等技术革新进步 数字经济迎来了快速发展的时期 从更深层次方面理解 数字经济也契合创新 协调 绿色 开放 共享的新发展理念 为我们国家经济社会发展注入了新动
  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 浅谈以太坊智能合约的设计模式与升级方法

    浅谈以太坊智能合约的设计模式与升级方法 1 最佳实践 2 实用设计案例 2 1 控制器合约与数据合约 1 gt 1 2 2 控制器合约与数据合约 1 gt N 2 3 控制器合约与数据合约 N gt 1 2 4 控制器合约与数据合约 N g
  • [区块链安全-CTF Protocol]区块链智能合约安全实战(已完结)

    区块链安全 CTF Protocol 区块链智能合约安全实战 前言 1 The Lost Kitty 2 RootMe 3 Trickster 4 The Golden Ticket 5 Smart Horrocrux 6 Gas Valv

随机推荐

  • 使用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