Inicio
Buscar
Ingresar
Registrarse
Starfield: el juego que revolucionará el espacio y la tecnología
Hack x Crack - Comunidad de Seguridad informática
»
Seguridad Informatica
»
Cracking
»
Duda con relleno de shellcode
Imprimir
Páginas: [
1
]
Ir Abajo
Autor
Tema: Duda con relleno de shellcode (Leído 5423 veces)
metalerk
Metalerk
{ L0 } Ñuub
Mensajes: 5
Sólo dame una shell y yo haré el resto...
Duda con relleno de shellcode
«
en:
Diciembre 29, 2015, 08:52:50 am »
Hola amigos que tal.
Vengo a presentar una duda que he buscado pero no entiendo (soy nuevo en el exploiting y el reversing) y no estoy muy seguro si esta es la sección correcta.
Tengo un programa mas o menos asi:
Código: C
#include <string.h>
#include <stdio.h>
void
func
(
char
*
arg
)
{
char
nombre
[
32
]
;
strcpy
(
nombre
,
arg
)
;
printf
(
"
\n
Bienvenido %s
\n
\n
"
,
nombre
)
;
}
int
main
(
int
argc
,
char
*
argv
[
]
)
{
if
(
argc
!=
2
)
{
printf
(
"Uso %s NOMBRE"
,
argv
[
0
]
)
;
exit
(
0
)
;
}
func
(
argv
[
1
]
)
;
printf
(
"Fin
\n
\n
"
)
;
return
0
;
}
Estoy probando un ejemplo de como sobreescribir el registro EIP para que cuando mi función func se ejecute desde main, ret(el registro IP regresando de la subrutina) use como siguiente valor almacenado en EIP el mismo que tenía antes de entrar a func y por lo tanto vuelva a entrar a func.
Y para explotarlo se le pasa como argumento algo asi (el ejemplo original era con perl pero prefiero python)
Suponiendo que el archivo se llama prog
Código:
[Seleccionar]
$ ./prog `python -c 'print "A"*44 + "\x8b\x84\x04\x08"*4`
La memoria está en formato little endian (0x0804848b)
Esa dirección de memoria se obtuvo de:
Código:
[Seleccionar]
$ objdump -d ./prog | grep func
Se que obviamente esa dirección corresponde a donde se ejecuta el call func, mi duda es porque "A" tiene que repetirse 44 veces exactamente antes de inyectar la dirección de memoria para repetir dos veces la funcion, en función de qué depende la longitud del relleno en un shellcode?
Saludos !!
«
Última modificación: Diciembre 29, 2015, 08:39:13 pm por Krakakanok
»
En línea
¿Me preguntas porque GNU/Linux es mejor que Microsoft Windows?
Simple...porque GNU/Linux hace lo que yo quiero como quiero.
ravenheart
{ L7 } Juanker
Mensajes: 1359
Todos mis mensajes están bajo la licencia WTFPL v2
Re:Duda con relleno de shellcode
«
Respuesta #1 en:
Diciembre 29, 2015, 07:44:14 pm »
Depende del compilador y la configuración del mismo, pero bueno.
Las variables locales y los argumentos de funciones se almacenan en la pila, igual que la dirección de retorno de las llamadas.
Bueno, en x86-64 hay un nuevo estándar y la mayoría de parámetros se pasan en registros, pero olvidemos eso por ahora.
Entonces,
4/8 bytes de un puntero (*arg), esto es lo primero que se mete en la pila
4/8 bytes del puntero a la dirección de retorno
32 bytes de variable local (nombre)
En total hacen 40 o 48 bytes (incluso si trabajas en 32 bits, es posible que las variables se alineen a 8 bytes, depende del compilador y del sistema para el que compilas, entre otras cosas).
Es posible que me deje algo, hace mucho que no trasteo con estas cosas, pero creo que eso es todo.
En tu caso parece que son 48 bytes. Los 44 de relleno, y los 4 de la dirección de retorno. Como la pila va en sentido inverso (es decir, si ESP contiene 108, al hacer PUSH EAX, pasa a contener 104 y en la posición 104 se guardará el contenido de EAX), la dirección de retorno estará siempre al final.
Lo mejor es que te busques un buen depurador y sigas el código, viendo lo que hay en cada posición. Rellena las variables con información fácil de identificar. GDB con KDevelop era razonable en mis tiempos, pero hablo de hace muchos años, supongo que habrá mejorado. Si no, windows y Visual Studio.
En línea
You do not need hope if you have drama to back you up.
ravenheart
{ L7 } Juanker
Mensajes: 1359
Todos mis mensajes están bajo la licencia WTFPL v2
Re:Duda con relleno de shellcode
«
Respuesta #2 en:
Diciembre 30, 2015, 07:43:42 pm »
Se me olvidaba, normalmente se guarda el contenido de EBP en la pila para usar EBP como copia del ESP original (para no tener que andar recalculando offsets a las variables cuando se meten o sacan cosas de la pila). Van 44 bytes, faltan 4.
En línea
You do not need hope if you have drama to back you up.
metalerk
Metalerk
{ L0 } Ñuub
Mensajes: 5
Sólo dame una shell y yo haré el resto...
Re:Duda con relleno de shellcode
«
Respuesta #3 en:
Diciembre 31, 2015, 07:40:20 pm »
Muchisimas gracias, creo que más claro no pudo ser.
De todos modos aun se me complica un poco este tema pero ya poco a poco de leer tus respuestas y algunos tutoriales va cayendo algo de luz a este camino
En línea
¿Me preguntas porque GNU/Linux es mejor que Microsoft Windows?
Simple...porque GNU/Linux hace lo que yo quiero como quiero.
ravenheart
{ L7 } Juanker
Mensajes: 1359
Todos mis mensajes están bajo la licencia WTFPL v2
Re:Duda con relleno de shellcode
«
Respuesta #4 en:
Enero 01, 2016, 11:31:01 am »
Lo he probado con VS2015 y no funciona. En modo debug, las variables locales ni siquiera están en la pila. En release sí, pero la llamada se hace inline y se omite el RET. En ambos casos, Windows detecta que hay memoria corrupta y finaliza la aplicación.
Es imposible contestar a tu pregunta de forma general, pero bueno, espero que con lo que había puesto veas por donde van los tiros
En línea
You do not need hope if you have drama to back you up.
metalerk
Metalerk
{ L0 } Ñuub
Mensajes: 5
Sólo dame una shell y yo haré el resto...
Re:Duda con relleno de shellcode
«
Respuesta #5 en:
Enero 03, 2016, 08:46:15 am »
Lo que sucede es que estoy trabajando esto en linux
En línea
¿Me preguntas porque GNU/Linux es mejor que Microsoft Windows?
Simple...porque GNU/Linux hace lo que yo quiero como quiero.
Imprimir
Páginas: [
1
]
Ir Arriba
Hack x Crack - Comunidad de Seguridad informática
»
Seguridad Informatica
»
Cracking
»
Duda con relleno de shellcode
Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso...
OK
Learn more