Ethernaut Lvl 14 Gatekeeper 2 Tutorial: cómo se inicializan los contratos (y cómo realizar operaciones bit a bit)

Esta es una serie en profundidad sobre los rompecabezas de seguridad de contratos inteligentes del equipo de Zeppelin. Aprendemos conceptos clave de Solidity para resolver los acertijos al 100% por tu cuenta.

Este nivel requiere que te familiarices con el papel amarillo de Ethereum y pases tres puertas más.

Funcionamiento interno de la creación de contratos

El papel amarillo denota formalmente la creación de contrato como:

A continuación, se muestra un flujo simplificado de cómo se crean los contratos y qué significan estas variables:

2. En segundo lugar, basándose solo en los datos de entrada de la transacción, se (pre) calcula la dirección designada del nuevo contrato. En esta etapa, los valores del estado de entrada se modifican, pero el estado del nuevo contrato aún está vacío.

3. En tercer lugar, el código de inicialización se inicia en el EVM y crea un contrato real.

4. Durante el proceso, las variables de estado se cambian, los datos se almacenan y el gas se consume y se deduce.

5. Una vez que el contrato termina de inicializarse, almacena su propio código en asociación con su dirección (pre) calculada.

6. Finalmente, el gas restante y un mensaje de éxito / falla se devuelven de forma asincrónica al s del remitente.

Sugerencia: tenga en cuenta que hasta el paso 5, no existía ningún código en la dirección del nuevo contrato.

En la nota al pie del documento amarillo:

Durante la ejecución del código de inicialización, EXTCODESIZE en la dirección debería devolver cero, que es la longitud del código de la cuenta, mientras que CODESIZE debería devolver la longitud del código de inicialización (como se define en H.2

En pocas palabras , si intenta verificar el tamaño del código de un contrato inteligente antes o durante la construcción del contrato, obtendrá un valor vacío. Esto se debe a que el contrato inteligente aún no se ha realizado y, por lo tanto, no puede ser consciente de su propio tamaño de código.

Operaciones bit a bit

Solidity admite las siguientes operaciones de puerta lógica:

Aviso

¡Ahora tienes todo el conocimiento para resolver el nivel!

Tutorial detallado

A continuación, pasemos la Puerta 3 antes que la 2, ya que el valor de clave es un requisito previo para invocar la función en la Puerta 2. Para resolver la Puerta 3, observe:

2. Recuerde que si A xor B = C , entonces A xor C = B . Esto significa que la clave es solo el bytes8 tipocast de:

Por último, observe que Gate 3 usa una función de ensamblaje para verificar que el tamaño del contrato de llamada sea cero, es decir, que contenga 0 código . Pero su contrato de llamadas debe tener código en primer lugar para poder invocar GatekeeperTwo.

Entonces, ¿cómo es esto posible?

Recuerde que durante la construcción de un contrato, implementa código de su dirección (pre) calculada, ¡pero ese código aún no se almacena en asociación con el contrato en sí!

Esto significa que extcodesize (remitente) debería devolver 0, si extcodesize es una subrutina dentro de la función constructor original del contrato del remitente.>

3. Coloque la llamada a la función enter () dentro de la construcción del contrato de su Hack.sol :

¡Felicidades por pasar ambas puertas!

Conclusiones clave sobre seguridad

Más niveles

Obtenga las mejores ofertas de software directamente en su bandeja de entrada