CTF-DeFi Hack
DeFi Hack由于这个是一个题目集,就写在一起,做个写题记录五个题目的源代码,都在这里了:源代码:点击
May The Force Be With You题目要求是:要取得合约中所有的代币
首先还是看代码,合约代码,还是简单,重点还是看向withdrew函数,要撤回合约中的所有代币,
function withdraw(uint256 numberOfShares) external nonReentrant { // Gets the amount of xYODA in existence uint256 totalShares = totalSupply(); // Calculates the amount of YODA the xYODA is worth uint256 what = numberOfShares.mul(yoda.balanceOf(address(this))).div(totalShares); _burn(msg.sender, numberOfShare ...
Uwerx攻击事件分析
攻击介绍2023年8月2日,Uwerx被黑客攻击,损失了175ETH。
攻击分析我们通过phalcon来分析。
通过调用栈能发现攻击者通过不断在uniswap V2 Pool交换,最终获利。很明显是Pool的兑换比率被破坏了。之所以能被破坏,是因为uwerx TOKEN合约的_transfer()方法被利用了。
function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 ...
UniswapV3,V4 功能对比
以下功能对比摘抄于官网V4 与 V3虽然 Uniswap v4 的基础集中流动性与 Uniswap v3 相同, 架构和会计存在一些关键差异。
单例设计矿池创建V4:单例合约有助于创建矿池和 还会存储其 state。此模式可降低创建池时的成本 以及执行多跳交换。因为矿池是合约状态,而不是全新的合约本身,所以矿池的创建成本要低得多。
V3:工厂合约负责创建矿池。池是 一个单独的 Contract 实例,用于管理自己的 state。矿池初始化 成本高昂,因为合约创建是 gas 密集型的
Flash Accounting (快速记帐)V4:单例使用 flash accounting,即解锁 PoolManager 的调用方 允许进行余额更改操作(多次掉期、多次流动性修改等) 并且只需要在序列的最末端执行 token 传输。
V3:因为 V3 中缺少 Flash Accounting,所以这是责任 集成合约执行代币转账,在每次单独调用后,对每个单独的矿池合约进行代币转账
流动性费用会计V4:应计费用在修改流动性时起到抵免的作用。 增加流动性会将费用收入转化为流动性 仓内流动性降低会自动 要求提 ...
git 协作流程
团队协作首先使用在gitub 上进行团队的协作,就是你自己要先弄一个分支,然后再提交上去,流程如下:git clone 仓库进入到仓库中:cd 仓库名然后切换分支到要协作的分支:git checkout 分支名创建自己的分支:git checkout -b 分支名1写好自己的部分再提交:git add .同上提交:git commit -m “描述”推送至远程自己创建的分支:git push origin 分支名1这样就可以再创库中看到自己的分支,然后再提交去分支名(也就是说pr:Pull requst)注意要指定review;
个人上传文件到仓库 将本地文件上传到github上,要有一个自己想上传的仓库,cd 要上传的文件名,git remote add origin (ssh下的仓库地址),切换分支,主要是看仓库是master,还是main, 还是其他的分支,git branch -M main , 切换到main分支上直接上传到分支上 git push -u origin main即可
初始化一个仓库git init 仓库名写好文件后使用git add . 将文件上传至缓存区查看 ...
CTF-degen-jackpot
CTF-degen-jackpot题目源代码:点击
题目要求:首先合约有1000个代币,你初始有一个代币,你的任务是提取全部的代币从合约中。
这个题合约看似很多,其实功能明显FNFTHHandler合约是这个币的一些操作LockManager合约是进行锁定地址的操作OtherContract 合约,就是其他合约OtherInterface 合约,就是接口的实现,可以在这里看见合约的一些功能函数。Revert 合约,这个就是主合约了,也是我们要重点分析的合约TokenVault合约,显而易见。金库合约,
要想取得全部代币,还是先看那里可以转出,在Revert合约中,有个撤回函数
function withdrawFNFT(uint fnftId, uint quantity) external override revestNonReentrant(fnftId) { address fnftHandler = addressesProvider.getRevestFNFT(); // Check if this many FNFTs exist in th ...
CTF-opyn-sesame
CTF-opyn-sesame题目源代码:点击
要求是:获得合约中所有的余额
和之前那个看涨期权有点像,这个是看跌期权,所还是的对这个股市的一些专有的词一些理解,这篇文章写的很好点击
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家族学完了再来解题。