CTF-safu-swapper
CTF-safu-swapper题目源代码:点击
题目要求:还是获得pool池的全部代币
这题合约,有俩个,一个主要实现计算,一个主要实现流动性池,首先主要就是看合约流动性提供者,怎样改变流动性,是否有漏洞,果然被发现在移除流动性,发现使用的是 uint amount = IERC20(token).balanceOf(pool); return (amount.mul(units)).div(totalSupply); 而我们在Safupool合约中,并没有发现能改变 baseAmount,tokenAmount,换句话来说,就是在我们以transfer转入代币时合约不会更新baseAmount,tokenAmount,实际上合约是通过 uint amount = IERC20(token).balanceOf(pool);来计算份额,pool会认为已经收到了转账。而增加流动性是:
function addLiquidity(uint256 _baseAmount, uint256 _tokenAmount) public returns (uint liquidityUnits ...
ERC4626
ERC4626含义ERC-4626 是优化和统一收益资金库技术参数的标准。 它为表示单个底层 ERC-20 代币的份额的代币化收益资金库提供标准应用程序接口。 ERC-4626 还概述了使用 ERC-20 的代币化资金库的可选扩展,提供存款、提取代币和读取余额的基本功能。
它主要是运用在收益金库中
定义asset:由 Vault 管理的基础 Token。 具有由相应的 EIP-20 合约定义的单位。share:Vault 的 token。具有标的资产比率 在 Mint / Deposit / Withdraw/redeem (由 Vault 定义) 时兑换。fee:Vault 向用户收取的资产或份额数量。可以存在费用 存款、收益、AUM、提款或 Vault 规定的任何其他内容。滑点:广告股价与经济现实之间的任何差异 存款到金库或从金库取款,不计入费用。
功能asset :function asset() public view returns (address assetTokenAddress)函数返回用于资金库记账,存款,取款的带代币地址。
total ...
CTF-Flash-Loaner
CTF-Flash-Loaner题目源码:点击
题目要求:FlashLoaner 合约接受用户的资金以促进闪电贷,其中他们收取少量费用。这笔费用作为收益提供给储户。
您的任务是从该合约中抽走 99%+ 的用户资金。您开始时没有资金。
这题看起来就是很闪电贷。但是阅读完后,并没有发现一些漏洞,突破口就是这个代码: IFlashCallback(msg.sender).flashCallback(fee, data);可是我们的回执函数能做些什么呢,除了还款我想不到其他方向了
再次审阅合约,发现这个闪电贷是继承ERC4626合约的,意味着它也可以实现存取功能,所以思路就打开了,首先借入一些代币,在调用deposit函数,存入闪电贷中,满足还款条件,然后再执行withdraw函数,又将代币撤回
攻击合约:
//SPDX-License-Identifier: MIT
pragma solidity^0.8.17;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IUniswapV2 ...
CEXISWAP攻击事件分析
攻击介绍cexiswap被黑客攻击,黑客从中盗取了3w的USDT。(CEXISWAP是一个去中心化的多链交易所,通过贸易管道技术在DEX和CEX之间桥接流动性)
TX:0xede72a74d8398875b42d92c550539d72c830d3c3271a7641ee1843dc105de59e
攻击分析我们通过phalcon来看。攻击合约直接调用受害者的initialize(),使自己成为了admin,再调用受害者的upgradeToAndCall(),再upgradeToAndCall()中受害者再次delegatecall攻击合约的0x1de24bbf函数。
很明显,受害者为对initialize()进行访问限制,导致被攻击。
POC
//SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.10;import"forge-std/Test.sol";import"./interface.sol";// Attacker : https://etherscan.io/addres ...
CTF-bonding-curve
CTF-bonding-curve题目码源:点击
题目要求:他们即将推出的游戏发布了两个代币合同:EMN和TOKEN,它们允许你根据各自的粘合曲线进行铸造。
DAI 用于铸造 EMN,EMN 用于铸造 TOKEN。
您的任务是窃取至少 50,000 个 DAI。您开始时没有token。
这次感觉后面的题目就上难度了,粘合曲线就是一个新知识了。
首先这个合约这个合约有点多,慢慢来分析,BancorBondingCurve合约实现了一个关键的债务曲线,数学知识很多,了解就行。EminenceCurrency合约实现了EMN->TOkEN,买入token,消耗EMN。EminenceCurrencyBase合约实现了DAI->EMN,买入EMN,消耗DAI,EminenceCurrencyHepler合约,就是对债务曲线的实现。
梳理完后,就是要获得DAI代币,而我们又没有钱,所以就只能借,那就是闪电贷的实现,这道题很容易想到套利,那么如何在买卖中获得利润,就是我们要实现了的
在EminenceCurrencyBase合约看到买EMN的函数
function buy(uint _ ...
CTF-governance-shenamigans
CTF-governance-shenamigans题目源码:点击
要求是;NotSushiToken 治理代币合约已经上线,旨在决定谁是最佳寿司厨师。谁不想要这样的荣耀呢?该合约只允许 WLed 地址投票。幸运的是,你的 Sybil 攻击让你获得了 3 个可以投票的 WLed 地址。你的目标是获得最多的委托投票,成为真正的寿司之王。你手中有 500 个代币,而你的竞争对手有 2000 个。
从题目中就可以得到一点方向,就是有3个可以投票的地址,说明我们肯定要运用起来
整个合约的逻辑就是委托投票,那么如果,我们将原有的500 个代币,委托给那3个地址,给我们投票,那么我们不就有很多票了吗
看向代码,允许我们这么做吗
function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator ...
CTF-MasterChef
CTF-MasterChef题目源码;点击
要求是:有一个 MasterChef 合约,它接受 MULA 代币并向质押者铸造 MUNY 作为奖励。
MULA 具有通缩转账税机制,每次转账会销毁 5% 的数量,以有效激励长期持有者。
你的任务是欺骗 MasterChef,使其为你铸造分配给所有质押者的所有 MUNY。你开始时拥有 10,000 MULA。
看到有源代码,和之前的质押合约很像,存款获得奖励,而我们就是要获得这个MdsterChef合约中全部的奖励,看到题目说有5%的手续费,初步想法就是会不会是溢出啥的,但是看到存取代码时,我并没有看见有对5%的手续费的说明
//_pid是流动池的ID function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); ...
ERC721
ERC721非同质代币标准
简介非同质化代币(NFT)用于以唯一的方式标识某人或者某物。 此类型的代币可以被完美地用于出售下列物品的平台:收藏品、密钥、彩票、音乐会座位编号、体育比赛等。 这种类型的代币有着惊人的潜力,因此它需要一个适当的标准。ERC-721 就是为解决这个问题而来!
ERC-721 为 NFT 引入了一个标准,换言之,这种类型的代币是独一无二的,并且可能与来自同一智能合约的另一代币有不同的价值,也许是因为它的年份、稀有性、甚至是它的观感。
是的。 所有 NFTs 都有一个 uint256 变量,名为 tokenId,所以对于任何 ERC-721 合约,这对值contract address, tokenId 必须是全局唯一的。 也就是说,去中心化应用程序可以有一个“转换器”, 使用 tokenId 作为输入并输出一些很酷的事物图像,例如僵尸、武器、技能或神奇的小猫咪!
主要功能协议函数如下:
function balanceOf(address _owner) external view returns (uint256);function ownerOf(uint2 ...
CTF-nft-bonanza
CTF-ntf-bonanza题目源代码:点击
要求是:新的 NFT 交易合约 BonanzaMarketplace 已经推出,它允许交易选定的白名单 ERC721 和 ERC1155 代币。您的挑战是获得所有列出的 NFT。
根据源码,可以发现此时的NTF都是ERC721代币,所以了解ERC721非同质化代币标准,会很好的理解。
要获得所列的NTF,就先看看,buyItem函数
function buyItem( address _nftAddress, uint256 _tokenId, address _owner, uint256 _quantity ) external nonReentrant isListed(_nftAddress, _tokenId, _owner) validListing(_nftAddress, _tokenId, _owner) { require(_msgSender() != _owner, "Cannot ...
可怕的外部调用?
往往对于一个功能成熟的DAPP,如uniswapV2,多签钱包等,都是通过多个智能合约实现的,那么就多多少少都会涉及到外部的调用,然而这就带来的很大的风险。如果不能确保外部调用的合约是正常且不带恶意逻辑代码,那么对自身合约就是个定时炸弹,不知道哪天就调用了一个不正常的恶意合约,引爆炸弹。
外部调用会引发的一些常见漏洞:重入攻击,外部合约的安全性问题,重放攻击等
具体来看一下代码:
function deposit( uint256 farmDeposit, address payable from, address to ) external returns (uint256 shares) { require(farmDeposit > 0, "deposits must be nonzero"); require(to != address(0) && to != address(this), "to"); require(from ! ...