
Exploit del kernel de Windows para CVE-2021-1732, un use-after-free en win32kfull.sys que permite la escalada local de privilegios mediante la creación de ventanas manipuladas y la manipulación de callbacks.
win32kfull!NtUserCreateWindowEx, donde una llamada de retorno del kernel al modo usuario para asignar memoria y la configuración del atributo tagWND->flag están desincronizadas, lo que permite falsificar el valor de tagWND->offset y causar un desbordamiento de memoria.win32kfull.sys llama a NtUserCreateWindowEx para crear una ventana, verifica tagWND->cbWndExtra (cantidad de memoria adicional asignada por instancia de ventana). Si el valor no es nulo, llama a la función win32kfull!xxxClientAllocWindowClassExtraBytes que realiza una llamada de retorno al espacio de usuario user32.dll!__xxxClientAllocWindowClassExtraBytes para asignar espacio. La dirección asignada se corrige mediante la función , ajustando la pila y regresando al kernel para guardarla y continuar la ejecución. Sin embargo, cuando el valor de incluye el atributo , el valor guardado se convierte en un offset.NtCallbackReturntagWND->flag0x800user32.dll!_xxxClientAllocWindowClassExtraBytes, llamar a NtUserConsoleControl para modificar tagWND->flag incluyendo el atributo 0x800, y luego usar NtCallbackReturn para devolver un valor personalizado al kernel en tagWND->offset.win32kfull!NtUserCreateWindowEx.win32kfull.sys llama a NtUserCreateWindowEx para crear una ventana, verifica tagWND->cbWndExtra (cantidad de memoria adicional asignada por instancia de ventana). Si el valor no es nulo, llama a la función win32kfull!xxxClientAllocWindowClassExtraBytes que realiza una llamada de retorno al espacio de usuario user32.dll!__xxxClientAllocWindowClassExtraBytes para asignar memoria. La dirección asignada se corrige mediante la función NtCallbackReturn, ajustando la pila y regresando al kernel para guardarla y continuar la ejecución. Cuando el valor de tagWND->flag incluye el atributo 0x800, se utiliza acceso por offset para ese valor.NtUserConsoleControl para modificar la bandera (flag) incluyendo el atributo 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
Se menciona que llamar a NtUserConsoleControl reestablecerá tagWND->offset y el valor de tagWND->flag incluyendo el atributo 0x800. Cuando la bandera contiene 0x800, se utiliza acceso por offset. El propósito de llamar a NtUserConsoleControl aquí es modificar el valor de tagWND->flag para que incluya 0x800, y luego llamar a NtCallbackReturn para devolver un valor específico con el objetivo de modificar tagWND->offset, porque win32kfull!xxxClientAllocWindowClassExtraBytes colocará el valor de retorno en tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`