Páginas: [1]
|
 |
|
Autor
|
Tema: Usar Buffers libres en un Stack Overflow...¿? (Leído 1262 veces)
|
-=nITROUs=-
Desconectado
Mensajes: 197
....Acción si límite... no hay tope...
|
Que tal... Bueno, tengo una duda: En la mayoría de ejemplos sobre STACK OVERFLOWS ponen algo como: Código: ... int main(int argc,char **argv){ char buffer[1024]; strcpy(buffer,argv[1]); } Lógicamente vemos que pasando los 1024 bytes de buffer, más 8 bytes de alineamiento (si es compilado con las nuevas versiones de GCC , creo q apartir de la 3) y mas 8 bytes de registros a sobreescribir correspondientes ($EBP & $EIP) pues nos da el SEGMENTATION FAULT (SIGSEGV)... o sea, con tan solo 1040 bytes se desborda y podremos poner la shellcode dentro de 1032 bytes (ya que no podemos meter la shellcode en $ebp ni $eip por que en $eip va la direccion de memoria de nuestra shellcode ok). Ahora mi duda es... Código: ... int main(int argc,char **argv){ char foo[12],nitro[8],lame[24],buffer[1024]; strcpy(buffer,argv[1]); } Entonces akí, para "OVERFLOWEAR" xD dicho programa, como en la stack fueron declarados primero dichos arreglos de tipo char, pues tendríamos que sobreeescribir los (1024+8)+(24+8)+(8+8)+(12+8)+(8..estos son los de los registros EBP Y EIP)... todos esos 8s sumados son los bytes de alineamiento ok... entonces tendríamos que meter 1108 bytes para obtener el desborde... Entonces puedo usar todos esos arreglos para meter mi shellcode ?? Y otra más.. como se la dirección donde he almacenado mi shellcode ?? En el texto de DEX http://www.hakim.ws/textos/stackofdex.txtDonde dice: Citar: Woops!, ya llenamos todo el buffer, ya sabemos que hacer con los 967 bytes restantes, ya sabemos que shellcode usar, pero... QUE DIRECCIONES VAMOS A PONER? Bueno, hay una forma de hacerlo sacando la dirección automáticamente de %esp con una instrucción en ensamblador, que usan muchos exploits locales: ----------------------------------------------- void get_esp() { __asm__("movl %esp, %eax"); } ------------------------------------------------- Alguien podría poner alguna url sobre la explicación de dicha función ya que he buscado en google y no encuentro anda parecido :S... o si alguien ha visto un exploit usando esta función (yo si lo he visto por ahi pero no recuerdo que exploit), asi que si alguien tiene algún exploit x ahi, que pastee la url para analizarlo.... salu2...
|
|
|
|
|
En línea
|
|
|
|
®®
Colaborador
Conectado
Mensajes: 5.141
|
esa funcion pone en eax el valor de esp.
|
|
|
|
|
En línea
|
|
|
|
neo_geno
Desconectado
Mensajes: 40
|
----------------------------------------------- void get_esp() { __asm__("movl %esp, %eax"); } -------------------------------------------------
es muy simple, como ia han dixo, pone eax en esp, pero ¿para qeu lo hace?, o sea, ¿de qeu sirve?, la respuesta es facil, al hacer eso, obtenemos la direccion del puntero de la pila, el qal sera la direccion a la qeu apunte la shellcode.
|
|
|
|
|
En línea
|
LLoramos al nacer pq venimos a parar a este inmenso mundo de dementes. __________________________________________
El usuario ve cosas y se pregunta el porque, el hacker ve cosas y se pregunta el pq no hacerlo.
|
|
|
®®
Colaborador
Conectado
Mensajes: 5.141
|
eax en esp no, esp en eax.
|
|
|
|
|
En línea
|
|
|
|
Rentero
Desconectado
Mensajes: 1.120
La paciencia es la madre de la ciencia.
|
Haber, Mr. Potato. Esto dices tu: esa funcion pone en eax el valor de esp. Pero esto dice http://www.hackemate.com.ar/mirrors/karpoff/archivos/CURSOASM.txtLa funci¢n de la orden MOV es, como su nombre da a entender, "mover" un valor. Pongamos un ejemplo:
MOV AX,BX
Esta ¢rden en lenguaje ensamblador, copiar el contenido de BX en AX, conservando el valor de BX. Segun yo entiendo -> tu dices que pone el primero en el segundo y el texto dice que pone el segundo en el primero... Ahora que estoy aprendiendo ASm, ¿CON CUAL ME QUEDO?
|
|
|
|
|
En línea
|
|
|
|
Rentero
Desconectado
Mensajes: 1.120
La paciencia es la madre de la ciencia.
|
Pues Mr. Potato creo que tienes tu razón, lo he mirado en otra pequeña introducción y lo dice como tú, aún así estoy todavia con la duda...
¿Como puede ser eso? ¿Puede ser por lo de ax, bx, etc->16 bit...y eax, ebx, etc-> 32? P.D: Espero respuestas...
|
|
|
|
« Última modificación: 17 Julio 2004, 11:03 por neohex »
|
En línea
|
|
|
|
®®
Colaborador
Conectado
Mensajes: 5.141
|
vale, partamos de que es un movl y no un mov usea at&t: En la sintaxis de AT&T el destino de una operacion se pone en el segundo parametro y la origen se pone en el primer parametro. (Al reves que en los Intel). El nombre de los registros es precedido por el caracter porcentaje ("%"). Los valores inmediatos han de ser precedidos por el caracter "$". El tamaqo de los operandos se especifica mediante un ultimo caracter de la instruccion:"b" (8-bits) | "w" (16-bits) | "l" (32-bits). + info aqui: http://www.publispain.com/supertutoriales/programacion/ensamblador/cursos/1/linasm.htm y en google.
|
|
|
|
|
En línea
|
|
|
|
Rentero
Desconectado
Mensajes: 1.120
La paciencia es la madre de la ciencia.
|
Vale, gracias...ya está aclarado.
|
|
|
|
|
En línea
|
|
|
|
-=nITROUs=-
Desconectado
Mensajes: 197
....Acción si límite... no hay tope...
|
Muy bien...
entonces la funcion get_esp() RETORNA la dirección de %eax y ahi es dond debo apuntar a %eip ya q ahi irán los nops y/o shellcode o me ekivoco?? pero he buscado ejemplos de como lo usan en exploits y aun no encuentro alguno....
y si, lo estuve testeando en FreeBSD y pues tuve q buscar shellcodes (execve("/bin/sh"))para Free BSD x86 y ya la tengo, ahora solamente necesito la MALDITA dirección a apuntar %eip... salu2
|
|
|
|
|
En línea
|
|
|
|
servomac
Desconectado
Mensajes: 25
Powered by Debian Sarge & Kernel 2.6.7
|
Analiza un poco el nombre de la función ... si se llama get_esp() que es más probable, ¿que devuelva %esp o que devuelva %eax?
|
|
|
|
|
En línea
|
"Se necesita a un ladrón para atrapar a otro ladrón, y eso no lo enseña ningún catedrático." (HVC)
|
|
|
|
heap
|
Entonces puedo usar todos esos arreglos para meter mi shellcode ?? Supongo que la shellcode no tiene mas de 100 bytes, y como el buffer es tan grande pues ahi esta sencillito haz esto mete 200NOPS+Shellcode+ direcciones*(908-shellcode) asi no importa las direcciones igual ocupan memoria y conque se sobreescriban 2 ya esta hecho, antes de hacer el exploit prueba explotarlo por shell. otra más.. como se la dirección donde he almacenado mi shellcode ?? No necesitas saber la direccion exacta, para eso estan los NOPS asi eip ira saltando de direccion cada que encuentre un NOP hasta que llega a tu shellcode. Woops!, ya llenamos todo el buffer, ya sabemos que hacer con los 967 bytes restantes, ya sabemos que shellcode usar, pero... QUE DIRECCIONES VAMOS A PONER? Bien, la funcion que pusiste es util para armar el exploit en c pero para que entiendas bien el proceso usa gdb overflodea el programa con AAAAAA (usa perl para no tener que poner 1000 A) luego haz esto. (gdb) set $p=0xbffff000 (gdb) while(*$p!=0x41414141) >set $p=$p+1 >end (gdb) x/10x $p Cualquiera de las 3 direcciones que te de te seran utiles, solo arma ahora el exploit por shell y prueba una vez lo tengas, bajate un exploit de BOFS de otro programa y asi adaptas el codigo para tu nuevo exploit, son faciles de explotar y solo hace falta modificar otro exploit cambiandole unos numeritos. Bueno eso cuando tienes un stack > 50 (grande) pero que pasa si tu stack es de solo 5 bytes ?... bueno te dejo la duda, hay un texto de explotacion de BOFS avanzado, lee la parte de las enviromental variables eso te dara la idea. Si no me entiendes, pues relee....bye 
|
|
|
|
|
En línea
|
|
|
|
-=nITROUs=-
Desconectado
Mensajes: 197
....Acción si límite... no hay tope...
|
Si man, ya he hecho eso de GDB... pero al declarar el puntero a la dirección por ejemplo 0xbffff000 al ini9ciar el while de repente avanza unas direcciones y me dice que NO SE PUEDE acceder A DICHA DIR. DE MEMORIA.... y pues he intentado con muuuuchas direcciones más intentando calcular la direccion más o menos para caerle a un NOP pero no  por eso lo de usar la funcion de get_esp()... Otra duda: En el texto ese de DEX... primero dsd shell mete con perl las direcciones puras AAAA luego puras BBBB y luego puras CCCC y luego veo el core dumped en GDB y ya puedo hacer ese while para encontrar dir. con puros 0x41414141 pero que no se supone que al correr d nuevo el programa con otros argumentos (shellcode & stuff) tomará otra dirección d memoria?? o tmb sobreescribirá las A's q ya habían?? Salu2... PD: Si we, ya he leido ese texto de ENVIRONMENT VARIABLES (por eso hay q programar seguro y limpiar bien variables d entorno  )....
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Si man, ya he hecho eso de GDB... pero al declarar el puntero a la dirección por ejemplo 0xbffff000 al ini9ciar el while de repente avanza unas direcciones y me dice que NO SE PUEDE acceder A DICHA DIR. DE MEMORIA.... y pues he intentado con muuuuchas direcciones más intentando calcular la direccion más o menos para caerle a un NOP pero no  por eso lo de usar la funcion de get_esp()... Otra duda: En el texto ese de DEX... primero dsd shell mete con perl las direcciones puras AAAA luego puras BBBB y luego puras CCCC y luego veo el core dumped en GDB y ya puedo hacer ese while para encontrar dir. con puros 0x41414141 pero que no se supone que al correr d nuevo el programa con otros argumentos (shellcode & stuff) tomará otra dirección d memoria?? o tmb sobreescribirá las A's q ya habían?? Salu2... PD: Si we, ya he leido ese texto de ENVIRONMENT VARIABLES (por eso hay q programar seguro y limpiar bien variables d entorno  ).... dsd != desde q' != que Si no puedes tomarte el tiempo para escribir bien, para que yo logre entender lo que preguntas, menos me voy yo a tomarme el tiempo para entenderte y responderte. Si buscas ayuda expresate claro.
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|