2021年春秋杯网络安全联赛春季赛 GameContract WriteUp

robots

 

今年春秋杯春秋杯出了一到特别的杂项题 还是个从来没接触过的ETH合约的CTF题 通过查找大量文章找到了ETH合约的调用方法 这里详细写出解题过程以便后人学习ETH合约的调用

GameContract

题目分析

访问题目网站 要求使用ETH钱包地址注册 使用浏览器扩展metamask注册之(这也是为了方便后续对合约函数的调用)

准备好 Rinkeby 测试网络的 ETH 用作手续费转入所注册后给的 ETH 地址中

看到如此大的价格波动 肯定是利用价格波动赚差价了
到这里还不知道GETFLAG的条件 这是一个ETH合约题 所以我们转向ETH合约去看看合约代码写了什么

使用测试网络区块链浏览器查看交易列表 发现了合约地址

区块链浏览器自带的反编译工具 反编译合约代码

审计源码发现一个疑似getflag的函数 (这里面还有一个坑 getflag函数名没有公开 询问主办方才给了函数名 在最后放出了合约的部分源码)
需要使用 10*10^6 个币(1000W)兑换flag 初始有1W币
之后就进行股票交易操作来满足题目要求了
通过利用股票价格波动进行频繁买卖操作最终得到了1000W币

合约的调用

下面是对合约函数的调用操作 (看到排行榜有个大佬几亿个币却不会兑换flag太可惜了)
这里用到的工具是http://remix.ethereum.org/
这是一个ETH合约开发调试工具 这里用来调用现有的链上合约

打开网站右键新建一个文件 命名为*.sol 例如test.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 */
contract TEST {

    function payForFlag() public{
    }
}

这里只用写出要调用的函数里面不需要写功能 比较像c语言的函数声明 但还有很大的区别 写完一定要ctrl+s保存并编译

   function TEST123(uint256 TEST) public view returns (uint256){

    }

这个是带传参和返回值的写法
写完函数声明点击左侧Deploy & run transactions

环境选择 Injected Web3

此时metamask扩展会弹出授权窗口 输入密码 授权要操作的ETH账号(这里是股票平台注册时填写的ETH地址所属的钱包账号 )

授权成功后会显示钱包地址和ETH余额 (在发起合约交易一定要保证账户有充足的ETH用作手续费)
这里不使用本地调试 而是调用链上合约所以只需要在At Address右侧填入合约地址
0xec36a74b9d08e796662c032d61530d94061679ea
点击At Address按钮 (如果按钮灰色 根据下面的报错提示 请检查合约地址是否正确 上面的步骤是否正确完成)

最后一步展开点击操作按钮 在浏览器钱包弹出的窗口授权 即可调用合约
通过钱包查看交易地址 在区块链浏览器查看交易状态 Status为Success即为调用成功

在注册邮箱收取flag

(完)