Título: No puedo sobrescribir EIP (Linux) Publicado por: zhynar_X en 26 Diciembre 2007, 16:42 pm Hola, el caso es que estoy intentando crear un exploit para el tipico programa vulnerable en linux pero no consigo sobrescribir el EIP... aver si me pueden ayudar:
El codigo vulnerable es: Código
Compilo y pruebo: Código: zhynar@zhynar:~/Desktop$ gcc bug2.c -o bug2 -ggdb Ahora lo abro con el gdb: Código: zhynar@zhynar:~/Desktop$ gdb bug2 Aver si me pueden ayudar... :) :) Saludos ;) ;) Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: sirdarckcat en 26 Diciembre 2007, 17:01 pm EIP guarda la instruccion en la que se encuentra.
si no puede leer la memoria en 0x41414141 entonces EIP nunca llega a tener ese valor. busca smashing the stack for fun and profit.. es como que lo basico de BoF, y es para linux :P, lo que "reescribes" es el valor de retorno, no EIP, EIP toma el valor de la direccion de retorno, se que parece que es lo mismo pero no.. EIP no puede ser "sobreescrito", siempre tiene valores validos. blah, en otras palabras.. coloca la direccion de retorno que quieres en la posicion especificada que debe ser.. mm desde el char 16, creo.. Saludos!! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: zhynar_X en 27 Diciembre 2007, 03:05 am Que lio que me estoy haciendo... xDxD En windows no tarde na en hacer el **** exploit.... xD
A ver a partir de la 'A' 16 si pongo un offset deberia ir a esa parte de la memoria, asi que tengo que ponerle un offset a la shellcode pero... En que parte de la pila meto la shellcode y despues como saco el offset a la shellcode?? En windows se que ponia la shellcode en la direccion de ESP y despues hacia un "jmp esp" pero por .lo que veo en linux es diferente... xD Saludos ;) ;) Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: sirdarckcat en 27 Diciembre 2007, 11:49 am esque en linux la dirección de la pila es constante, o era.. depende del kernel..
lee el documento que te digo xD es de aleph1. Saludos!! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: zhynar_X en 2 Enero 2008, 23:23 pm Bueno ya he leido bastante y ya me he enterado de lo que tengo que hacer xD
Pero ahora hay una cosa que no se... Meto la shellcode en el buffer y tengo que sobrescribir el RET con la direccion de la shellcode, osea la direccion de buffer y para ello tengo que poner su direccion en la posicion de la cadena que sobrescribe el RET, pero como pongo su direccion de forma que la pila la interprte? Es decir... como meto un offset en un string?? Saludos Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 14 Enero 2008, 02:16 am Bien zhynar_X, creo que si estas estudiado ;D, y eso es bueno.
Bien vi tu codigo y es de los clasicos BOF, sin embargo el buffer que estas dejando en muy pequeño para propositos educativos y de aprendizaje, yo recomiendo buffer mas grande, ya que veas como funciona en un buffer grande, vas a ver la forma de hacerlo en buffer pequeños, sin embargo yo estoy casi seguro que con 12-16 bytes nadie va a poder meter un shellcode completo ahi :xD. Bien una direccion aproximada de la pila donde se esta almacenado tu variable la puedes conseguir con la siguente funcion Código: unsigned long get_esp(void) { Sin embargo vas a tener que restar algunas decenas o centerares de bytes. Ahora bueno para buffer pequeños, uso algo que le aprendi a rojodos ;D Código: %gdb ./codigo Vemos que en mi sistema trata de saltar a las H's lo cual nos deja un buffer de 7x4 un total de 28 bytes para poder ejecutar un shell. huy en FreeBSD, he visto un shell de 25 bytes, creo que si se puede ejecutar ;D, lo tengo que poder hacer, solo que atinarle al valor exacto que se tiene que meter al ret va a estar muy dificil de calcular. Este solo es para FreeBSD Código: char shellcode[]= Por eso comento que para practica personal, es necesario un buffer un poco mas grande. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 14 Enero 2008, 02:24 am El problema que tienes es porque estás intentando explotar main. Desde hace relativamente poco, el gcc hace una cosa un poco rara al principio y al final de main, que es para alinear la pila. Mas o menos y resumiendo lo que hace es salvar y restaurar la pila, en la pila XD. Es decir, antes de la dirección de retorno en la pila está esp guardado.
Antes del ret de main, hace (más o menos): pop %ebp pop %esp ret Si te cargas el %esp guardado en la pila, el ret no funcionara. Por eso obtienes un esp y un ebp sobreescrito con 0x41. Todo esto puedes verlo si haces un disass de main. En resumen, la funcion main hay que explotarla de otra forma, concretamente sobreescribiendo el esp guardado en la pila, en vez de sobreescribir eip. Un saludo. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 14 Enero 2008, 02:31 am Código: %gdb ./codigo Vemos que en mi sistema trata de saltar a las H's lo cual nos deja un buffer de 7x4 un total de 28 bytes para poder ejecutar un shell. huy en FreeBSD, he visto un shell de 25 bytes, creo que si se puede ejecutar ;D, lo tengo que poder hacer, solo que atinarle al valor exacto que se tiene que meter al ret va a estar muy dificil de calcular. En FreeBSD no sé si hace lo de salvar el esp o no, pero seguro que intenta saltar a 0x48484848?, no será que hace un ret con esp = 0x48484848 o algo parecido?. Para salir de dudas: x/1i $eip En el momento que da el sigsegv. Un saludo. PD: Segun he visto un main de tu otro post (como usar el gdb), tiene toda la pinta de que en FreeBSD (al menos en el tuyo) no hace lo de salvar esp en la pila, sino que usa el leave de toda la vida (ebp). Usease que en tu caso si que debe de intentar saltar realmente a 0x48484848, y la explotación en más sencilla. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 14 Enero 2008, 02:49 am En FreeBSD no sé si hace lo de salvar el esp o no, pero seguro que intenta saltar a 0x48484848?, no será que hace un ret con esp = 0x48484848 o algo parecido?. Para salir de dudas: x/1i $eip En el momento que da el sigsegv. Un saludo. Mira, estoy seguro que hace algo, sin embargo todavia no estoy completamente seguro de que hace, despues del prolog, ejecuta cosas que ni al caso pero bueno, preguntemosle esto a los que hacen gcc ;D Código: (gdb) disas main Si lo sobre escribe el eip Código: (gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII y tambien el ebp, pero ese no hay mucho que decir... mirar: Código: (gdb) info register Ok salimos de Dudas... ;D Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 14 Enero 2008, 02:50 am Joer, me voy a volver loco de tanto editar mis posts jeje. Si, en tu caso usa %ebp para restaurar %esp y retornar, osea que no hay el problema que si existe en linux. Un saludo.
PD: Que version de gcc usas?. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 14 Enero 2008, 02:57 am viene predeterminada con el sistema ;D, es la 3.4.6, mirar:
Código: %gcc -v :huh: No sabia que ahora linux tubiese ese problema... a partir de que version de ; kernel salio eso, alquien tiene el link. ? tendre que modificar mis exploits para linux, si se trata de un BOF dentro de main :rolleyes: Hey zhynar_X, que kernel de Linux usa tu Debian ? y cual es la version de gcc ? para poder verificar todas las dudas aqui susitadas. ;D Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 14 Enero 2008, 03:21 am Mi gcc es el 4.1 . La verdad es que tiene más pinta de ser del gcc, que de Linux especificamente. Sería interesante probar un gcc más actual en Freebsd y mirar si hace lo mismo o no. Un saludo.
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 14 Enero 2008, 07:22 am Bien, ahora tengo 2 o mas problemas entre mano, la verdad me obseciona demasiado este tema.
trate de explotar el codigo mostrado por zhynar_X, sin embargo no he tenido mucho exito :xD El codigo vulnerable es: Código
BIen creo que con lo que mostrare a continuacion resolvere una dudas sobre como meter una dirccion en el ret, atravez de la cadena de ingreso. al programa vulnerable. Es decir... como meto un offset en un string?? Saludos Bien eso se hace de muchas maneras puedes crear un archivo con el buffer y despues hacer un cat Código: % ./codigo `cat evilbuffer.txt` Puedes usar perl, un exploit, shell scritp, pyton, variables de Entorno etc, lo que mejor se te de, pero si sabes programar en C, recomiendo encarecidamente C. Hice un exploit para tu codigo y no funciona. :rolleyes: ya me trae como loco, he aqui el exploit eexploit.c Código
Bien estoy seguro que el codigo vulnerable que compile con el gcc 3.4.6 en cual si le mandamos de AAAABBBBCCCC.... se atora en la H Código: %gdb ./codigo de la A a la G hay 28 espacios disponibles lo que hace el exploit que cree, es pide un offset, para jugar con el desplazamiento... ya saben lo clasico de Aleph One Con este espacio tan reducido todo tiene que estar mas que calculado. y el buffer que se manda a la aplicacion vulnerable, es en si lo siguente 3 NOP's 25 bytes de Shellcode 3 veces la direccion de retorno (4 bytes de cada una) para un total del buffer de 40 bytes, aunque solo sea nesesaria la Primera como vimos. Despues ejecute el exploit manualmente y me enfade :P Código: %./eexploit 20 asi que genere otro archivo en c para poder ejecutar el exploit con todas las direcciones posibles xploitforcebrute.c Código
Y nada >:(, se tiene que poder pero no se si algo este mal, si alguien nota algo por favor que lo mensione aqui, por eso repito que lo buffers peque;os estan dificiles de explotar, pero si cabe el shellcode, y la direccion de retorno, estoy con que se debe de poder. Mi gcc es el 4.1 . La verdad es que tiene más pinta de ser del gcc, que de Linux especificamente. Sería interesante probar un gcc más actual en Freebsd y mirar si hace lo mismo o no. Un saludo. Si efectivamente es la version de gcc Código: %gcc41 codigo.c -o codigo -ggdb -static Bien ahora se atora en la D, dejo exactamente los 12 bytes de Buffer :o, que optimizacion tan cabrona, lo voy a analizar detenidamente para ver que hace exactamente. y poder dar con la forma de explotarlo, pero eso si va a ser imposible que se meta una shellcode en esos 12 bytes... :huh: Almenos que :rolleyes: huy no lo habia visto es una idea bien loca a lo mejor a alguien ya se le ocurrio, pero bueno se me acaba de ocurrir ahorita que es posible sobre escribir todo los datos y mandar el shell code hasta el final ejemplo del buffer: AAAAAAAAAAAA + RET'ssss + NOP'ssssssss + shellcode. esto en Lugar del clasico NOP'ssssssss + Shellcode + RET'sssss Lo probare ahora mismo. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 14 Enero 2008, 07:40 am AHUEVO que funciona.... por lo menos yo no lo havia visto asi :o
Este exploit funciona para el buffers pequeños, y funciono a la primera para el codigo de zhynar_X eexploit2.c Código: #include<stdio.h> Código: %gcc -o eexploit2 eexploit2.c ;D ;D :rolleyes: :rolleyes: ;D :o ;D :rolleyes: :rolleyes: :o ;D ::) ::) ::) :xD El buffer quedaria asi: RET'ssss + NOP'ssssssss + shellcode. + NOP'sssss la version del codigo vulnerable que explote, fue compilada con gcc 3.4.6 Ahora solo resta explotar el codigo compilado con el gcc 4.1 Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 14 Enero 2008, 13:44 pm Si efectivamente es la version de gcc Código: %gcc41 codigo.c -o codigo -ggdb -static El problema es que salva esp en la pila (a traves de ecx), y lo restaura antes de hacer el ret. La forma de explotarlo seria sobreescribir ese valor con una direccion en la que controlemos el contenido. Ejemplo: - Sobreescribimos esp guardado por 0xdededede (es un caso ficticio). - 0xdededede es una direccion en la que controlamos su contenido, el cual es: 0xabababab - En 0xabababab tambien controlamos su contenido, el cual es: la shellcode Al sobreescribir el esp guardado, antes del ret: %esp = 0xdededede. Hace el ret y salta a 0xabababab, la cual es la direccion de la shellcode. Cambiando de tema, en ese ejemplo no importa que el buffer sea pequeño. Puedes meter la shellcode en argv[2] por ejemplo, sin limite de tamaño. Un saludo. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 15 Enero 2008, 16:37 pm Bien, despues de varios intentos he logrado explotar el Bof de zhynar_X, esta vez fue al 4to Intento
Código: %gcc -o eexploit_gcc41 eexploit_gcc41.c -ggdb -static Fue tal vez exesivo pero ya que ;D al fin se pudo. He aqui el xploit. Código
Cualquier duda con cuaquiel cosa seguir el hilo. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 18 Enero 2008, 03:28 am Algo que note, y la verdad no se si sea la version de mi gcc es que no le caben los 12 bytes reservados mirar
Código: %./codigo AAAA A ver si alguien nos puede hechar lamano con esto, de todos modos yo lo vere con mas calma. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: RaiSe en 18 Enero 2008, 14:36 pm Algo que note, y la verdad no se si sea la version de mi gcc es que no le caben los 12 bytes reservados mirar Código: %./codigo AAAA A ver si alguien nos puede hechar lamano con esto, de todos modos yo lo vere con mas calma. Si le entran, en el último estás metiendo 13 bytes, porque strcpy añade un null (0x00) al final, y por eso da segmentation fault. Eso que es con el gcc 4 o el 3?. PD: El exploit que es para el vulnerable compilado con gcc 4 o el 3? Un saludo. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 18 Enero 2008, 22:17 pm Si le entran, en el último estás metiendo 13 bytes, porque strcpy añade un null (0x00) al final, y por eso da segmentation fault. Eso que es con el gcc 4 o el 3?. ;D Gracias por confirmarmelo RaiSe definitivamente me la pase pensando en eso parte de la Tarde de ayer, y cai en la cuenta de que efectivamente el byte NULL (0x00), Ocupa el lugar numero 13 lo cual sobre escribre sobre los datos continuos de la Pila. Si el binario antes mostrado que se corrompe con el byte numero 13 esta compilado con gcc 4.1.3 PD: El exploit que es para el vulnerable compilado con gcc 4 o el 3? El ultimo exploit mostrado anteriormente esta hecho para aplicaciones con BoF compiladas con gcc 4.1.3 funciona en mi FreeBSD no se si funcion en Linux no tengo en este momento una distro instalada para comprobarlo, y todos los CD-Live que tengo manejan gcc 3. Bien, despues de varios intentos he logrado explotar el Bof de zhynar_X, esta vez fue al 4to Intento Código: %./eexploit_gcc41 40 300 200 El primer intento con el exploit para los BoF compilados con gcc 4.1.3 que mostre, funciona perfectamente tambien en mi sistema pero esto estando en Modo terminal, sin modo grafico. La funcionalidad del exploit cambia ya que la funcion: Código
abquiere un valor de la pila actual en un momento determinado del sistema, y este valor cambia dependiendo de la cantidad de programas que esten en ejecucion en ese momento. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 17 Diciembre 2010, 00:10 am Buenas noches,
Perdonad que vuelva a revivir el post, pero es que llevo unos cuantos dias intentando hacer un stack overflow en linux y me está costando por (creo yo) una chorrada. El problema que tengo es que cuando introduzco varias "A" como argumento del programa, he observado que una vez sobreescrito todos los bytes correspondientes (por ejemplo 32), el siguiente byte siempre me lo pone a cero (en nuestro caso el 33 seria 0). Esto me está provocando errores a la hora de intentar hacer el overflow sobre la direccion de retorno. Os pongo un ejemplo para que lo veais. Esta es la pila del main antes del scrtcpy: Código: esp 0xbffff694 0xbffff694 Código: 0xbffff694: 0x0011eac0 0x0804842b 0x00288ff4 0x08048420 Fijaros en la dirección que resalto porque una vez que ejecuta el scrtpy me sobreescribe su primer byte. Es decir, de 0x00145ce7 pasa a 0x00145c00 Código: 0xbffff694: 0xbffff69c 0xbffff8a9 0x41414141 0x41414141 Esto hace que el programa no acabe correctamente su ejecución. Código: 0x00145c00 in __libc_start_main () from /lib/libc.so.6 Ya sabia de antes, que cuando metes un scring en la pila, escribe un nulo (0x00) para saber donde acaba. La pregunta es ¿hay alguna manera de quitar esos ceros para poder hacer un overflow? Con windows no me he encontrado problemas, ¿os ha ocurrido esto a vosotros? Gracias por vuestra atencion. Datos Código: 2.6.35-23-generic #41-Ubuntu SMP Wed Nov 24 10:18:49 UTC 2010 i686 GNU/Linux Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 18 Diciembre 2010, 15:59 pm Hola,
Aún no he conseguido que se ejecute la dirección del RET sobreescrita. No sé si será por ele compilador gcc, he estado dando vueltas por google y la verdad no sé por dónde pueden ir los tiros. Voy a intentar exponer el problema a ver si a alguien le ha pasado. Este es el código vulnerable: Código: #include <stdio.h> La variable "buffer" es de 16bytes. Ejecuto el gdb y pongo un break en la funcion "copirar" Código: (gdb) list Antes de ejecutar el strcpy miro la pila: La direccion de la variable "buffer" en la funcion copiar es 0xbffff67c Código: (gdb) print &buffer La direccíon de retorno a el main es 0x080483f4: Código: (gdb) disass main Ahora observo la pila en el breakpoint Código: esp 0xbffff674 0xbffff674 En la direccion 0xbffff67c comienza la varible "buffer" y en la direccion 0xbffff690 el RET Código: (gdb) x/50x $esp Sigo ejecutando: Código: (gdb) next Como vemos el RET (direccion 0xbffff690) se ha sobreescrito. Y como me pasaba en el comentario anterioir despues de escribir todas las "A", en byte siguiente lo sobre con ceros (ha pasado de 0x00145ce7 a 0x00145c00). En el siguiente paso el programa "casca" pero sin que el EIP ejecute el RET: Código: Program received signal SIGSEGV, Segmentation fault. La dirección donde se queda es el RET de la funcion copiar: eip 0x80483dd 0x80483dd <copiar+25> Código:
Me podeis echar una mano.?? Gracias Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 19 Diciembre 2010, 12:32 pm Me imagino que habrás deshabilitado las protecciones contra buffer overflow no?
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 19 Diciembre 2010, 21:24 pm Si, si, esta compilado asii:
gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 -ggdb ejemplo.c Graicas Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 20 Diciembre 2010, 19:53 pm A mí me paso esto durante un tiempo y también me parecía inexplicable. Prueba con un buffer mayor y pásale un argumento de aproximadamente el doble del buffer.
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 20 Diciembre 2010, 21:22 pm Hola,
Gracias por contestar. He probado con un buffer de 500 y 1000 "A" como parámetro y tampoco me ha funcionado. Además, he probado a compilar el gcc-3.4.6 y tampoco funciona. No sé es una cosa rara rara. Os dejo el traceo del gdb Código:
Lo que me parece raro es el mensaje: Program received signal SIGSEGV, Segmentation fault. 0x0804837d in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149 Gracias por la ayuda. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 20 Diciembre 2010, 22:01 pm Pues ya ni idea, tendré que desempolvar el hacking a nivel binario y probaré mañana a ver. De todas formas me parece muy extraño que la dirección que te dé sea "0x41414149".
Me parece que lo del null-byte no tiene nada que ver en absoluto. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 21 Diciembre 2010, 02:56 am Podrias poner el disas main de tu binario porfa.
Saludos!!! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 21 Diciembre 2010, 17:00 pm Y sin porfa lo pongo....
Código:
La dirección 0x41414149 corresponde a la de la variable "b": Código: Program received signal SIGSEGV, Segmentation fault. Gracias por la ayuda! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 24 Diciembre 2010, 11:11 am Hola!
Lo que no acabo de entender es por qué cuando se escribe la varible "b" de la funcion copiar da este casque, es una valor que está debajo del RET en la pila... ¿puede algo que ver la instrucción "ret" del copiar? Otra cosa que no acabo de ver es lo del byte-null, si pudiera evitar que se introdujera ese byte null no me llegaria a fallar.... ¿siempre que se introcen carácteres en la pila se pone este valor al final de la cadena? Gracias! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 26 Diciembre 2010, 14:52 pm Hola!
Ya he conseguido que se intente ejecutar el RET sobreescrito. Por lo visto gcc activa un flag para desactivar la ejecución en la pila. Este mecanismo se desactiva usando en parámetro "-z execstack" a la hora de compilar. Salu2! Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: AlbertoBSD en 1 Enero 2011, 03:00 am Excelente!!
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 1 Enero 2011, 19:56 pm Algo asi me paso en Linux xd...
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 3 Enero 2011, 15:36 pm 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 Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 3 Enero 2011, 17:06 pm 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. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 3 Enero 2011, 17:35 pm 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" Código: 0xbffff5a4: 0xbffff664 0x00119b02 0xbffff654 0x080481cc Tengo declarada el variable buffer con 128 bytes y el RET lo sobreescribo con 136. Y así paso los parametros Código: 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') Código:
He puesto que salte a la dir 0xbffff5b4 que es donde hay NOPS y obtengo esto: Código: rror accessing memory address 0x90909090: Error de entrada/salida. Se supone que tendría que ejecutar lo que hubiera en la dir. 0xbffff5b4 no¿?? Salu2 Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 3 Enero 2011, 17:46 pm 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: Código Una vez tengas la dirección solo tienes que sobrescribir eip con esa dirección. Prueba a ver. Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 3 Enero 2011, 19:33 pm A mi ese code me suena a "Hacking. Tecnicas fundamentales". Lo tengo aqui al lado xD
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 4 Enero 2011, 18:50 pm 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? Código Pues le meto 200 Bs y no me sobreescribe... Código: (gdb) r $(perl -e 'print "B"x200') Código: The program being debugged has been started already. Si no consigo sobreescribirlo no puedo seguir xD Gracias por vuestra ayuda Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: M3st4ng en 5 Enero 2011, 01:26 am 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 Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 5 Enero 2011, 11:20 am 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... Código: Starting program: /home/juanra/Escritorio/shell/vuln AAAABBBBCCCCDDDDEEEEFFFF La cosa es que no puedo modificarla... Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 5 Enero 2011, 17:10 pm Perdonad el doble post, pero sigo pensando en esto...
Alguien tiene alguna idea? Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 5 Enero 2011, 17:26 pm Muéstranos qué hay en la pila y en los registros.
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 5 Enero 2011, 17:32 pm Código:
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: braulio-- en 5 Enero 2011, 18:00 pm Me refiero a justo antes de ejecutarse strcpy()
Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 5 Enero 2011, 18:03 pm Código: (gdb) x/50x $esp Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Ivanchuk en 5 Enero 2011, 21:03 pm Desensamblate el binario y pasalo por gdb con stepi. Vas a tener que depurarlo a muerte :P.
Sino danos acceso ssh con una cuenta restringida que te ayudamos! :) Título: Re: No puedo sobrescribir EIP (Linux) Publicado por: Garfield07 en 7 Enero 2011, 12:50 pm Bueno, algo pensare...
Y... no ::) xD |