Reversing
Lo primero es entender como podemos comunicarnos con el driver, hay que entender que no podemos acceder a la memoria del espacio kernel sin embargo existe una interfaz del sistema operativo que permite esta comunicación, estas son las llamadas ioctl
, cuando se instala un driver establece un nombre de dispositivo llamando a la función IoCreateDevice
, utilizando IDA podemos desensamblar el driver y ver esta llamada en el bloque DriverEntry
, el nombre es \\.\HackSysExtremeVulnerableDriver
Cada función se identifica con un código ioctl
, el driver acepta las llamadas usando estructuras IRP
, o I/O Request Packets
, en este caso podemos ver una función almacenada en la tercera entrada del objeto llamada IrpDeviceIoCtlHandler
La función IrpDeviceIoCtlHandler
es la encargada de llamar a determinada función dependiendo de su código ioctl
, para ello utiliza una estructura tipo switch
Entre multiples comparaciones se muestra el código ioctl
perteneciente a cada función, en este caso nos interesa la que pertenece al código 0x222003
Siguiendo la flecha verde podemos ver que es el bloque encargado de llamar a una función con el nombre BufferOverflowStackIoctlHandler
que tiene la vulnerabilidad
Esta función simplemente se encarga de llamar a TriggerBuffferOverflowStack
pasandole un buffer que sera nuestra entrada y el tamaño de este
En la función TriggerBufferOverflowStack
podemos ver que se llama a memset
para reservar un espacio en memoria de tamaño 0x800
o 2048
en decimal
Finalmente se llama a una función llamada memmove
, pasando como destino el buffer reservado al inicio de la función y como fuente nuestro buffer introducido