Skip to content
On this page

S2C5: Assembly Memory

1. 问题

合约使用 Yul 内联汇编进行内存操作和数值计算。需要理解并操纵这些低级操作来满足 mintFlag 的条件。

2. 原因

合约在 Yul 汇编中使用了非标准的数值处理方式(如特殊的位移操作、内存布局操纵),导致 Solidity 层面的安全假设不成立。

3. 方案

分析 Yul 汇编代码,理解其修改了哪些存储槽位和内存区域。通过精确的调用参数来满足条件。

4. 遇到的陷阱

Yul 汇编语义: 汇编中的 shl, shr, mstore 等操作的语义与 Solidity 高层代码不同(如 bytes4 类型在汇编中是左对齐的)。

5. 陷阱的原因

Solidity 中 bytes4 是右对齐的(占用低 4 字节),但在 Yul 汇编中 bytes4 在 32 字节栈槽中是左对齐的(占用高 4 字节)。使用 shl(224, bytes4) 会把数据移到错误的位置。

6. 如何解决

在 Solidity 层面将 bytes4 先转为 uint256,再进行位移操作。避免在汇编中直接操作 bytes 类型:

solidity
bytes4 selector = bytes4(keccak256("someFunction()"));
uint256 shifted = uint256(uint32(selector)) << 224; // 正确

7. 技术要点

要点说明
Yul 汇编中 bytes4 对齐bytes4 在汇编栈中是左对齐的,与 Solidity 的右对齐不同
数据类型转换Solidity 和 Yul 之间的数据类型编码方式可能不同
内存操作Yul 的 mstore, mload 直接操作原始内存

Built with AiAda