capture the ether
对于随机数,来实现一个更好的理解。
math1第一个很简单,答案直接告诉你了,输入即可
2第二个,暴力破解,关键就是uint8,一个字节的符号,范围0-127,直接暴力破解,循环
3第三个,有一些拆分,由于哈希计算的是当前的时间戳,所以我们直接引用它的计算哈希的表达式就行了,写一个攻击合约,在同一笔交易中进行就可以了
4第四个,就要使用控制台了,查询当前的密码,然后输入就可以了
CTF-Extractoor
CTF-Etractoor题目源代码:点击
题目要求:已经启动了一场荷兰拍卖,以出售 1_000_000 个 FARM 代币。到目前为止,一个 degen 已经投入了 900 ETH。
您的任务是从 DutchAuction 合约中窃取至少 90% 的 ETH。
这次合约就只有一个,实现的是荷兰拍卖,我们要获取eth,所以我们就先看合约中,那个地方可以获得eth,发现commitETH合约中,能够返回eth,
function commitEth(address payable _beneficiary) public payable nonReentrant { // Get ETH able to be committed uint256 ethToTransfer = calculateCommitment(msg.value); /// @notice Accept ETH Payments. uint256 ethToRefund = msg.value - ethToTransfer; if (ethToTran ...
CTF-malleable
CTF-malleable题目源代码:点击
题目要求是:您一直在黑暗的森林中嗅探,并发现了 TreasureVault 合同。它需要合约所有者的验证签名才能提取选定数量的 ETH。
您已经记录了用户在之前的 tx 中用于提取一些 ETH 的签名。
耗尽剩余的合约资金。
首先先里了解一下签名,这是我有学到的一个新知识。
签名结构v、r 和 s 是以太坊签名的三个组成部分。签名用于验证消息的来源和内容。v 是恢复标识符,通常为 27 或 28,表示签名的版本。r 和 s 是签名的输出,用于确保消息未被篡改。
签名的生成签名包含三个部分:r、s 和 v。r 和 s 是椭圆曲线的点,而 v 表示恢复标识符。计算 s:当生成签名时,消息哈希(通常是交易或信息的哈希)会被用于计算 r 和 s。签名的 s 值通常会在 0 到曲线的参数 n 之间,因此在椭圆曲线中,s 值是可以被认为是模反的。攻击者如何计算 s
模反性:在椭圆曲线中,存在一个性质,允许将 s 值“反转”。具体来说,对于一个有效的 s,存在另一个有效的 s_,使得 s + s_ ≡ n(模 n),其中 n 是椭圆曲线的一个参数。因此,攻 ...
CTF-Side-Entrance
CTF-Side-Entrance题目源代码:点击
题目要求:有一个 CallOptions 合约,允许用户创建备兑 wETH-USDC 看涨期权。
他们甚至提供了 functionality 允许用户通过使用 Uniswap 闪电贷在没有任何资金的情况下执行他们购买的期权。
您的任务是窃取至少 90k USDC。您开始没有资金。
断更中,关于闪电贷加流动性的题真的很难,准备把uinswap家族学完了再来解题。
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 ...