非常有趣的一道区块连CTF题目的思考————king

2024-08-28 08:12

本文主要是介绍非常有趣的一道区块连CTF题目的思考————king,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

区块连CTF题目

区块连CTF题目king

  • 区块连CTF题目
  • 前言
  • 一、题目以及解答
  • 二、题目分析
    • 1.进攻receive()函数
    • 2.守护king
    • 强行selfdestruct转入为什么拿不到king


前言

这道题目在于处理接受函数的知识,另外我们结合selfdestruct函数进行分析


一、题目以及解答

这是一个非常有意思的问题:
首先下面的solidity代码是本次的题目,我们要求的是
1,拿到king,把king作为我们的地址。
2,让king无法再被下一个人拿到。

contract King {address king;uint256 public prize;address public owner;constructor() payable {owner = msg.sender;king = msg.sender;prize = msg.value;}receive() external payable {require(msg.value >= prize || msg.sender == owner);payable(king).transfer(msg.value);king = msg.sender;prize = msg.value;}function _king() public view returns (address) {return king;}
}

关于这个问题的第一步,可以很显然使用receive()函数对该合约转发prize数量的代币即可:

contract Hack{constructor(address payable target) payable {uint256 prize = King(target).prize();(bool ok,)=target.call{value:prize}("");require(ok,"call failed");}
}

此时,我们还要注意,拿到king之后不能被别人得到king,由于这里面的King合约没有设置receive,fullback。所以我们不用担心对其进行转账。但接下来的一个关键的问题是,如果对方合约使用selfdestruct()函数强行转至合约King会如何?其实,不管有没有触发receive()函数,都无法成功,因为转钱

二、题目分析

1.进攻receive()函数

让我们分解一下这段代码:

(bool ok,):这是一个元组,用来存储函数调用的结果。ok是一个布尔值,表示函数调用是否成功。target.call:这里target是一个合约地址或者合约实例,call是一个低级操作符,用来调用目标合约的call函数。call函数可以执行任意的字节码,但不会改变状态,也不会创建日志。{value:prize}:这是传递给call操作符的输入数据,value字段指定了要发送的以太币数量。(""):这是call操作符的参数,表示要调用的函数标识符。空字符串""通常用于调用没有参数的函数,比如receive()。prize:这是一个变量,代表要发送的以太币数量。

这段代码的意图可能是尝试通过call操作符来模拟发送以太币到一个合约的receive()函数。但是,实际上,receive()函数是自动被调用的,当以太币发送到合约地址时,不需要手动调用。

solidity

receive() external payable {

}

这里的payable关键字表明这个函数可以接收以太币。当以太币发送到合约地址时,receive()函数将自动执行。如果你需要在接收以太币时执行特定的逻辑,你可以在receive()函数内部添加代码。

2.守护king

在Solidity中,如果你想要让智能合约能够接收以太币(ether),确实需要定义一个可以接受以太币的特殊函数。这些函数包括:

receive():这是一个特殊的函数,用于接收以太币,没有参数,也没有返回值。它不能有任何可见性修饰符,如public或private,因为它是由以太坊虚拟机(EVM)在向合约发送以太币时自动调用的。fallback():这个函数在合约没有接收到匹配的函数调用时被调用。它也可以接收以太币,并且可以有参数和返回值。从Solidity 0.4.0版本开始,fallback()函数已经被废弃,推荐使用receive()函数。payable修饰符:如果你想要一个普通的函数能够接收以太币,你可以在函数声明时添加payable修饰符。例如:

solidity

function myFunction() public payable {
// 函数体
}

如果你没有定义receive()、fallback()或者带有payable修饰符的函数,合约将无法接收以太币。这是因为以太坊虚拟机在执行交易时,如果合约没有定义receive()或fallback()函数,它将不知道如何处理接收到的以太币。

然而,如果你的合约需要在接收以太币时执行特定的逻辑,你仍然需要定义一个receive()函数或者带有payable修饰符的函数。例如:

solidity

contract MyContract {
function receive() external payable {
// 接收以太币的逻辑
}
}

或者,如果你想要一个普通的函数能够接收以太币:

solidity

contract MyContract {
function deposit() public payable {
// 存款逻辑
}
}

请注意,自Solidity 0.8.0版本起,receive函数已经被移除,取而代之的是receive和fallback都被废弃,所有的以太接收逻辑都应该使用带有payable修饰符的函数来实现。这意味着,如果你正在使用Solidity 0.8.0或更高版本,你应该确保你的合约中有至少一个带有payable修饰符的函数,以便能够接收以太币。


强行selfdestruct转入为什么拿不到king

当以太币被发送到一个没有定义接收机制的智能合约时,这笔资金将无法被合约所接受。即使在合约中定义了receive函数,如果该函数尝试将收到的资金通过payable(king).transfer(msg.value);的方式转发给另一个地址,但该地址(在本例中为king)没有适当的接收函数,那么这笔资金将不会成功转移。相反,资金将被原路退回给最初的发送者,因为智能合约的receive函数无法处理没有接收机制的转账目标。

在编写智能合约时,开发者需要确保如果合约需要接收以太币,就必须定义相应的接收函数,并且考虑到所有可能的资金流向,确保资金能够按照预期的方式被接收和转移。

这篇关于非常有趣的一道区块连CTF题目的思考————king的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114213

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一