Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware
Autor
|
Tema: No consigo hacer un programa vulnerable a stack overflow (Solucionado) (Leído 2,739 veces)
|
|
~~
|
Pues si, soy así de tonto  Estoy intentando hacer un programa vulnerable a stack overflow en asm (por pura comodidad a la hora de debugear) q haga algo similar a la función strcpy para hacer alguna prueba con scodes y tal, pero no consigo hacerlo petar, por q meto punteros en la pila y lógicamente no peta... Aki pongo como lo estoy intentando para q se coja la idea mas q nada, por q llevo un buen rato dandole vueltas al asunto y no me sale: include 'H:\archivos de programa\fasm\include\win32ax.inc' .data buffer db '0123456789', 0 ; Buffer de 10 bytes addStr db '0123456789ABCDEF',0 ; La cadena a añadir .code start: push addStr push buffer call strcpy invoke ExitProcess, 0 proc strcpy buff, pegar invoke lstrlen, [pegar] inc eax invoke RtlMoveMemory, [buff], [pegar], eax invoke MessageBox, 0, [buff], 0, 0 ret endp .end start La cosa es q por muy grande q sea la cadena a añadir el programa no peta (lo mas q se podria lograr es si declarara buffer debajo de addStr seria modificar alguna variable....) weno, ya se q es lógico q no pete, ya q meto punteros, y casi me daba vergüenza preguntar una cosa tan tonta, pero es q no comprendo como trabaja strcpy para ser vulnerable..  Si alguien me pudiera orientar un poco de como mete el buffer entero en la pila en vez del puntero o que hace se lo agradeceria mucho Salu2
|
|
|
|
« Última modificación: 2 Abril 2008, 16:43 por E0N »
|
En línea
|
|
|
|
leos_79
Desconectado
Mensajes: 189
Anyway, Anyhow, Anywhere
|
no estoy muy en este tema , pero no es por la proteccion de stack del windows? el DEP?
|
|
|
|
|
En línea
|
|
|
|
|
~~
|
Por eso no es, por q si que puedo hacer programas vulnerables en C, pero quiero ver bien bien q hacen esos programas para ser vulnerables, la cosa es q no consigo emularlos...
|
|
|
|
|
En línea
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.213
Menos palabras y Mas codigos.
|
Por eso no es, por q si que puedo hacer programas vulnerables en C, pero quiero ver bien bien q hacen esos programas para ser vulnerables, la cosa es q no consigo emularlos... si lo q kieres es verlo, en cualkier prog en c se puede. Lo q vas a ver es q la variable local esta en la pila y al meter datos mayores a el espacio q reservo el programa para la rutina, se empieza a pisar datos, y si sobrescribis algun retorno, al seguir corriendo el programa va a saltar hacia donde apunte, o tildar si no corresponde a ninguna direccion. con olly se ve perfectamente :p
|
|
|
|
|
En línea
|
|
|
|
|
RaiSe
|
Yo no estoy muy puesto en formato de ensambladores, pero eso tiene pinta de que el overflow no se produce en la pila. Los punteros los pusheas a la pila, pero el overflow se produce en el segmento de datos (.data), con lo que no vas a conseguir sobreescribir la dirección de retorno de ninguna funcion. No hay algo para meter variables en la pila en los ensambladores? (.stack ?).
Un saludo.
|
|
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
include 'c:\cosas\fasm\include\win32ax.inc' .code start: call strcpy invoke ExitProcess, 0
proc strcpy mov edi,buffer mov esi,addStr mov ecx,1000h rep movsb ret endp
buffer db 11h addStr db "METE AQUI UN BUFFER GRANDE DE A Y VERAS LA PILA LLENA DE 41 Y EIP =" .end start
el codigo es una burrada pero peta.
|
|
|
|
|
En línea
|
|
|
|
|
RaiSe
|
include 'c:\cosas\fasm\include\win32ax.inc' .code start: call strcpy invoke ExitProcess, 0
proc strcpy mov edi,buffer mov esi,addStr mov ecx,1000h rep movsb ret endp
buffer db 11h addStr db "METE AQUI UN BUFFER GRANDE DE A Y VERAS LA PILA LLENA DE 41 Y EIP =" .end start
el codigo es una burrada pero peta. Mm, eso no hace que buffer y addStr esten en el segmento de codigo?, ese segmento siempre es de no escritura, entonces al intentar escribir en él dará una violacion de segmento. Creo que eso tampoco tiene que ver con un stack overflow, a no ser que el ensamblador meta los buffers buffer y addStr en la pila. No tengo ni idea de como se declaran variables en la pila en formato ensamblador, pero puedes mirar donde están en ese ejemplo con un debugger, y así salimos de dudas. Un saludo.
|
|
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
tienes razon, asi peta pero no como se busca  . lo de los permisos de la sección de codigo es lo de menos, siempre se pueden modificar antes de escribir en el. ya lo tengo, la declaras como local dentro de la funcion y entonces va a la pila: locals buffer db 11h endl
DS:[ESI]=[0040106F]=41 ('A') ES:[EDI]=stack [0006FFFF]=00
ahi si que estan los datos en la pila y chafa lo que encuentra por su camino. como ya dije el codigo es una burrada era para probar jeje.
|
|
|
|
« Última modificación: 2 Abril 2008, 13:18 por ®® »
|
En línea
|
|
|
|
|
~~
|
Gracias por los comentarios, ya me e aclarado algunos conceptos, pero sigo sin entender por q la funcion strcpy mete los parametros a la pila, no le veo mucho sentido, es mas logico meter los punteros, como toda la vida y mas simple por otra parte no? Weno, seguiré probando, me parece q la única opción para emular esto es declarar las variables como locales como ha dicho ®®, ya q esas variables se declaran dentro de la pila, así q no hay q meterles nada  Salu2
|
|
|
|
|
En línea
|
|
|
|
Distorsion
Desconectado
Mensajes: 212
15Hz ~ 20Hz
|
Strcpy pone los datos en la pila porque es mas rapido al acceder y despues se desechan los datos almacenados rapidamente para no consumir memoria de mas(se sobreescriben). Se ponen punteros al pasar tablas de dos dimensiones o typos de varibles creados por el usuario. Creo 
|
|
|
|
« Última modificación: 2 Abril 2008, 14:44 por Distorsion »
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
Bueno, pero no seria mas seguro meter un puntero?
|
|
|
|
|
En línea
|
|
|
|
|
~~
|
Si Mek, estoy de acuerdo, mas seguro y mas simple, weno al tema ya e pillado bien el concepto y e hecho un programa en asm vulnerable a stack overflow. Usar variables locales estaria mejor, pero me modifican la pila y es mas lioso, ademas la idea se entiende, q es lo q importa xD Aki os lo dejo, vereis q si escribis suficientes "AAAAA.." en addStr el programa petará ya q se sobreescribe la dirección de retorno q es laidea. Ahora a programar alguna shell code para el programa  include 'H:\archivos de programa\fasm\include\win32ax.inc'
.data buffer db '0000000', 0 addStr db 'AAAAAAAAAAAAAA',0 ; La cadena a meter en el buffer retorno dd ?
tamBuffer dd ? tamAddStr dd ?
.code start:
call strcpy invoke MessageBox, 0, [retorno], 0, 0
invoke ExitProcess, 0
proc strcpy ; Metemos sddStr en el buffer
; Obtenemos los tamaños de buffer y addStr invoke lstrlen, buffer inc eax mov [tamBuffer], eax invoke lstrlen, addStr inc eax mov [tamAddStr], eax
sub esp, [tamBuffer] ; Reservamos espacio en la pila para el buffer mov ebx, esp ; y ponemos en ebx donde empieza dicho espacio
invoke RtlMoveMemory, ebx, addStr, [tamAddStr] ; Copiamos en la pila la cadena
invoke LocalAlloc, LPTR, eax mov [retorno], eax invoke RtlMoveMemory, [retorno], ebx, [tamAddStr]
add esp, [tamBuffer] ret endp
.end start Lo e comentado un poco, pero me parece a mi q se entiende, lo unico aclarar q RtlMoveMemory es lo mismo q el api CopyMemory (copymemory realmente es un alias  ) Salu2 PD - Se supone q es esto lo q hacen las funciones vulnerables en C no?
|
|
|
|
|
En línea
|
|
|
|
|
|