Обход проверки на code size
В некоторых контрактах мы видели, что есть проверка на размер кода в require или условии. Напомню, что предполагается, если code size > 0, то это контракт, если меньше - пользователь.
Даже в одной из задач ранее порой требовалось обойти подобную проверку через конструктор.
Так вот, нашел интересный пример кода "призрачного" контракта, через который можно отправлять запросы в другие контракты, при этом проходя проверку на code size.
Вот этот контракт:
contract Ghost {
function sendGhostTransaction(bytes calldata payload) public returns (bool) {
assembly {
calldatacopy(0x80, payload.offset, payload.length)
let deployedAddress := create(0, 0x80, payload.length)
if iszero(deployedAddress){
mstore(0x00, false)
return(0x00, 0x20)
}
mstore(0x00, true)
return(0x00, 0x20)
}
}
}
В calldata подставляете вызов нужной функции в другом контракте.
#ghost #codesize #security
Post #543
358
- 👍 1