|
Desbordamiento de buffer local
en SHELL32.dll . Net monitor
Fecha
29-5-03
Versiones probadas
Estatus del vendedor
Microsoft fue informado hace meses, pero como lo único
que hacen es darme largas pidiéndome una y otra vez que les mande el archivo de prueba, he dedicido
publicarlo.
Descripción
Net monitor es una herramienta para analizar el tráfico que se incluye con
algunas versiones de windows. El programa permite analizar archivos de captura ( .cap ) además de capturar
el tráfico. Si se abre un archivo de captura con un nombre de 252 bytes net monitor se cierra
con una violación de acceso. El puntero de instrucción del programa es sobreescrito con el
nombre del archivo convertido a UNICODE, por lo que la causa es una corrupción de variables adyacentes en la
pila ( stack ).
Para poder ejecutar código mediante este fallo, se tiene que situar el código a ejecutar
en una variable de entorno del sistema, esto lo situará en una dirección de memoria que puede ser
referenciada por el valor que situemos en EIP en unicode ( ~00010040 ).
En concreto el crash se produce en esta función:
77E3A294 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
77E3A298 CD 2B INT 2B
77E3A29A C2 0400 RETN 4
Tras ejecutarse la interrupción 2B, el programa parece cambiar de stack y ESP
salta hasta ~6bf88. El programa se cerrará debido a que la pila está corrupta. Esa zona
de memoria es sobreescrita por la segunda llamada a MultiByteToWideChar en el módulo
shell32.dll.
775C059B FF7424 10 PUSH DWORD PTR SS:[ESP+10] (
Longitud del Wide buffer = 260 bytes )
775C059F 66:890E MOV WORD PTR DS:[ESI],CX
775C05A2 8A50 02 MOV DL,BYTE PTR DS:[EAX+2]
775C05A5 80E2 34 AND DL,34
775C05A8 80FA 34 CMP DL,34
775C05AB 0F84 8AA20400 JE SHELL32.7760A83B
775C05B1 56 PUSH ESI ( Puntero a Wide buffer )
775C05B2 83C0 0E ADD EAX,0E
775C05B5 6A FF PUSH -1
775C05B7 50 PUSH EAX ( filename )
775C05B8 51 PUSH ECX
775C05B9 51 PUSH ECX
775C05BA FF15 68185977 CALL DWORD PTR DS:[<&KERNEL32.MultiByteToWideChar>]
Creo que el fallo se encuentra en esta función, ya que al hacer la conversión a Unicode se
dobla el número de bytes de la cadena, por lo que al tener el archivo 252 al pasarlo a unicode queda en 504 bytes
.
Esta segunda llamada a MultiByteToWideChar se hace desde GetOpenFileNameW, que se
encarga de abrir el diálogo para elegir el archivo a abrir y de rellenar la estructura OpenFileName con el
nombre y path del archivo elegido. La llamada a GetOpenFileNameW se completa correctamente, el crash
ocurre más tarde al ejecutar la interrupción 2b. Esta interrupción ignoro qué hace,
según he encontrado en google es reservada de DOS y es equivalente a un RET.
NOTA: Cualquier apunte o correción será bienvenida, ya que yo sólo soy
estudiante y esto no se enseña en las clases de la universidad :D
Exploit
NetMonitor.bat ( -> netmonitor.ace -> netmonitor .zip )
Con este script se puede generar el archivo de captura con nombre largo que
provocará el fallo al ser abierto por Net monitor.
Créditos
Esta vulnerabilidad fue descubierta por David F. Madrid, redactor
de Nautopía.
-Vulnerabilidades-
|