Appearance
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 直接操作原始内存 |