- El desbordamiento de búfer de
strcpyen el manejo de gap name dentro de los archivos guardados de Create-A-Park terminó convirtiéndose en exploits de archivos guardados y de red en múltiples plataformas, incluyendo original Xbox, Xbox 360, PS2 y GameCube - En la versión de THPS4 para original Xbox, una cadena limitada a 31 caracteres se copiaba a un búfer de pila de 32 bytes sin verificación de límites, lo que permitía sobrescribir la return address; luego se ejecutaba shellcode usando el encabezado del archivo guardado y un segmento de datos ejecutable
- En THPS3, la misma entrada dañaba el heap en lugar de la pila, así que fue necesaria una cadena ROP pasando por un allocator personalizado y una ruta de vtable; en las versiones de THUG 1 y 2 para Xbox, la ruta de gap name quedó bloqueada por el stack cookie
- En el multijugador de THPS4, un host malicioso podía enviar un archivo de park al cliente para lograr ejecución remota de código y transferencia asíncrona de archivos; además, una fuga de memoria de red expuesta durante la transferencia se evitó dentro del exploit con un hot patch
- Tony Hawk’s American Wasteland en Xbox 360 también permite ejecutar ROP mediante el desbordamiento de gap name, pero la ejecución completa de código en el hypervisor solo es posible al combinarlo con un bug del system call handler del kernel 4548; el código fuente y el archivo guardado parchado se publicaron en GitHub
Punto de partida: gap name y strcpy
- En 2016, mientras se buscaba un nuevo bug de hackeo de archivos guardados para original Xbox, el archivo guardado de custom park de Tony Hawk’s Pro Skater 4 pasó a ser objeto de análisis
- La función Create-A-Park de THPS4 permite que el jugador cree su propio skate park y ponga nombre a los gaps, que son secciones de salto
- El gap name es una cadena definida por el usuario compuesta por hasta 31 caracteres y un null terminator
- Si esta cadena se procesa con una función como
strcpy, puede convertirse en un primitive de corrupción de memoria
- Al cambiar el gap name por una cadena maliciosa larga de repeticiones
0x41, copiar el archivo guardado al Xbox y cargarlo, la consola se bloqueó y el instruction pointer quedó en0x41414141- Esa era la señal de que el gap name se copiaba a la pila y sobrescribía incluso la return address
- El análisis en IDA mostró que, al recorrer la lista de gaps del archivo guardado, el juego copiaba
gap_namedesave_file_gap_dataagap_description gapDescen la pila usandostrcpy- Como no había verificación de límites, la copia continuaba hasta encontrar el null terminator
- Esa versión del juego estaba compilada sin stack cookie, así que era posible sobrescribir datos de la pila y la return address
THPS4 en original Xbox: mover shellcode a una región ejecutable
- El original Xbox no tenía DEP por hardware para impedir la ejecución de datos arbitrarios como los dispositivos modernos, pero los kernels más recientes y algunos juegos sí incluían cierto soft DEP
- Funcionaba cambiando la dirección del selector del segmento de código para permitir ejecución solo por debajo de cierta dirección
- La pila y las asignaciones del heap donde quedaba el archivo guardado estaban fuera de la región ejecutable
- Como el segmento de datos read-write del ejecutable del juego estaba dentro de una región ejecutable, se usó la estrategia de copiar ahí el código y luego ejecutarlo
- El nombre del park está en el encabezado del archivo guardado y, cuando el jugador selecciona el archivo, los primeros 136 bytes del encabezado se copian a una struct en el segmento de datos del ejecutable para mostrarlos en la UI
- No se puede modificar libremente todo el encabezado, pero sí hay espacio suficiente para meter un pequeño stub de
memcpy
- No se puede modificar libremente todo el encabezado, pero sí hay espacio suficiente para meter un pequeño stub de
- Flujo del exploit de THPS4 en original Xbox
- Tras cargar el archivo guardado y antes de presionar “Start Game”, los primeros 136 bytes se copian al segmento de datos del ejecutable
- Al presionar “Start Game”, el gap name malicioso se copia a la pila y la return address queda sobrescrita con la dirección del stub de copia de shellcode
- Cuando la función retorna, salta al stub de copia, que mueve el payload grande del búfer del archivo guardado al segmento de datos ejecutable
- Después de la copia, salta al payload y obtiene ejecución arbitraria de código
Bypass de firma y la habibi key
- Después de obtener ejecución de código en original Xbox, el siguiente paso era desactivar la verificación de firmas y ejecutar un ejecutable unsigned
- El payload se construyó a partir del payload del archivo guardado del softmod installer ya existente de 007 Agent Under Fire
- Localiza funciones y direcciones de datos del kernel, y también la dirección de la RSA public key usada para verificar la firma del ejecutable
- Desactiva la write protection del machine state register y parchea la RSA public key con la habibi key
- Luego ejecuta un ejecutable auxiliar incluido en el archivo guardado; durante las pruebas se usó un ejecutable de
nyan cat
- Se cree que el habibi key pair es una clave RSA creada a inicios de los 2000 por un grupo de hacking de Linux para original Xbox
- En vez de hacer que la verificación de firma RSA del kernel siempre pasara, reemplazaban la public key por la suya para ejecutar un loader de Linux
- Fue una decisión para evitar que ese archivo guardado sirviera para ejecutar contenido pirateado, aunque luego otros grupos publicaron archivos de exploit para instalar hacks persistentes
- Un detalle llamativo es que el modulus de la habibi public key difiere de la Microsoft RSA public key por solo 4 bytes
- Parecería que el exponent tendría que cambiarse a 3, pero los payloads de shellcode existentes no cambian el exponent
- No está del todo claro cómo funciona exactamente
- Se eligió el método de la habibi key por su compatibilidad con múltiples versiones del kernel de Xbox
- Parchear la función de verificación de firma para que siempre devolviera true requeriría pattern matching de instrucciones según la versión del kernel
- Con la habibi key basta con aplicar un patch de 4 bytes en una ubicación de memoria fácil de encontrar
Análisis de variantes: THPS3, THUG, THAW
-
Tony Hawk’s Pro Skater 3
- THPS3 también tenía Create-A-Park y gap name, pero no se bloqueaba justo después de cargar el archivo de guardado malicioso
- Era posible patinar dentro del juego, y la consola se bloqueaba al seleccionar “quit game”
- gap name se copiaba al heap y no a la pila, y el overflow sobrescribía el allocation header de la siguiente asignación del heap
- Cuando la siguiente asignación se liberaba, los punteros del header llevaban a la vtable que contenía el function pointer de la rutina de cleanup
- THPS3 no copiaba el encabezado del archivo de guardado a un segmento de datos ejecutable como THPS4, y los datos del archivo de guardado también estaban en memoria heap no ejecutable
- Sobrescribiendo el puntero
pAllocOwner, se controlaba la ubicación desde donde se cargaba el function pointer de cleanup, y se usaba una ROP chain en la memoria del archivo de guardado con un stack pivot - La ROP chain, con solo unos cuantos gadgets, copiaba el shellcode del heap a un segmento de datos ejecutable y saltaba hacia allí
- Después de eso, igual que con el payload genérico de THPS4 “hack xbox kernel”, se aplicaba el parche de la habibi key y se ejecutaban ejecutables no firmados
-
Tony Hawk’s Underground 1 & 2
- Al hacer fuzzing de gap name en THUG, en vez de una access violation se producía un bug check completo con el mensaje
Buffer overrun detected! - El ejecutable incluía una verificación de stack cookie
- Un stack cookie es un valor aleatorio colocado antes de la return address, y se verifica antes de que la función regrese para ver si cambió
- Para sobrescribir la return address era necesario conocer el valor del cookie, pero en la ruta de gap name no había forma de filtrarlo
- Había variables corruptibles entre el buffer de gap name y el stack cookie, pero el propio código del juego las sobrescribía enseguida, así que no eran útiles para el exploit
- También se consideró la explotación de SEH, pero no había forma de provocar una excepción en el código restante antes de la verificación del stack cookie, y en ese momento tampoco había un exception handler registrado que recorriera la cadena SEH
- THUG2 tampoco permite un exploit basado en gap name en la versión de Xbox por las mismas razones
- Aun así, existen otros bugs de
strcpyy bugs explotables basados en heap - Las versiones de PlayStation 2, PC y probablemente GameCube fueron compiladas sin stack cookie, por lo que sí es posible explotarlas con el buffer de gap name
- Al hacer fuzzing de gap name en THUG, en vez de una access violation se producía un bug check completo con el mensaje
-
Tony Hawk’s American Wasteland
- Como THAW es un juego posterior a THUG 1 y 2, se esperaba que tuviera stack cookie, pero la versión de Xbox fue compilada sin stack cookie
- Era vulnerable al buffer overflow de gap name, y el exploit se construyó casi igual que en THPS4
RCE de red en THPS4: hackeando al cliente sin archivo de guardado
- Como el exploit con archivo de guardado requería una memory card, se eligió como superficie de ataque de menor barrera el multijugador LAN
- Si se usaba en LAN multiplayer un park creado con Create-A-Park, el host enviaba el archivo de guardado por la red y el cliente lo cargaba
- Se planteó que sería posible hackear la consola cliente enviándole un archivo de park malicioso
- Para evitar que el host se hackeara a sí mismo, se modificó el ejecutable del juego para bloquear el bug de
strcpy, y también se agregó un code segment para funciones adicionales - Al principio el cliente podía conectarse al host y patinar normalmente, pero el payload no se ejecutaba y tampoco se activaba el buffer overflow
- Los datos del archivo de park en la memoria del cliente habían sido alterados y ya no coincidían con el archivo del exploit
- Después de cargar el archivo de park, el host lo volvía a guardar desde memoria y enviaba ese resultado al cliente, dañando los datos del exploit
- Al convertir esa llamada de función en NOP, el cliente recibió el archivo de park malicioso, quedó comprometido y cambió el color del LED
- En la ruta de red, el encabezado del archivo de guardado no se copia al segmento de datos, así que no se puede usar el stub de copia de shellcode del exploit local de THPS4
- Se copia el shellcode a memoria ejecutable con una ROP chain similar a la de THPS3
Descubrimiento del código fuente de THUG y uso del código de red
- Era necesario entregar por la red al cliente un ejecutable payload auxiliar, pero no se podía colocar junto con el exploit dentro de la carpeta del save game como en el exploit local
- También se evaluaron métodos para cargar el ejecutable desde un CD grabado o desde una dirección de red local, pero no se adoptaron
- La implementación de winsock en Xbox usa por defecto una conexión de socket segura, por lo que hubo que reproducir la capa de seguridad de Xbox con un script de Python
- Mientras se buscaba material relacionado con el archivo de guardado del park, una búsqueda de la cadena
Sk4Ed_Deadllevó al repositoriothugen GitHub- Se determinó que no era una herramienta homebrew, sino el código fuente completo de Tony Hawk’s Underground
- Aunque no era exactamente THPS4, el codebase era lo bastante similar como para aprovecharlo en el código de red y en la escritura de hooks
- En el código fuente estaban el código de carga del archivo de park y la línea exacta donde estaba el bug de
strcpy- Fue posible reconstruir el archivo de proyecto de Visual Studio, corregir algunos compiler errors y crear una build ejecutable con los assets finales del juego
- No parece ser exactamente el código de la versión final, pero sí uno muy cercano
- El objetivo dejó de ser un simple RCE y pasó a ser obtener RCE de forma silenciosa en la consola que se conectaba a la partida, habilitar la ejecución de código no firmado y luego transferir un ejecutable auxiliar durante la partida
Restauración de la ejecución y transferencia asíncrona de archivos
- Para transferir el payload mientras el cliente seguía jugando, hacía falta restaurar el flujo de ejecución del juego después de ejecutar el shellcode
- La ROP chain se modificó para guardar el stack pointer original antes del stack pivot y restaurarlo más tarde después de ejecutar el shellcode
- Luego copiaba el shellcode a memoria ejecutable y saltaba hacia él
- El sistema de red del juego está estructurado para registrar un message ID y una handler function, y llamar al handler correspondiente según el ID del mensaje recibido
- Se registró un message ID no utilizado para implementar un protocolo simple de transferencia de archivos
- Cuando el cliente se conecta, envía
MSG_ID_PAYLOAD_REQUESTal host para iniciar la transferencia - El host envía los datos del payload con mensajes
MSG_ID_PAYLOAD_DATA - Cuando el cliente recibe
PAYLOAD_MSG_ID_END, la transferencia se completa
- Cuando el cliente se conecta, envía
Una fuga de memoria de 15 años y un hot patch
- Durante la transferencia del archivo, la consola cliente se bloqueaba por una null pointer dereference
- El network data allocator devolvía NULL, y los bytes libres del networking memory pool llegaban a 0
- En el código fuente de THUG sí existía código para liberar el message data buffer, pero esa corrección no estaba en la build publicada de THPS4
- El buffer
p_datadestream_descno se liberaba en cada mensaje, por lo que el networking memory pool se agotaba - Puede que en partidas multijugador normales esto no causara problemas a menos que se permaneciera mucho tiempo conectado
- El buffer
- El exploit aplicó un hot patch enganchando el código del cliente para liberar el buffer
p_desc->p_datacon la función de liberación correcta - Después del hot patch, la transferencia de archivos funcionó en las consolas host y cliente, y el cliente ejecutó el ejecutable
nyan-cat- Usando una app de tunneling, el mismo exploit también se probó de forma remota en la consola de un amigo en otra región
Flujo final del exploit de red en la Xbox original
- el cliente se conecta a una consola host maliciosa y recibe por red el archivo de park “Hack Xbox”
- cuando el cliente analiza el archivo de park, ocurre un desbordamiento de búfer y se sobrescribe la dirección de retorno de la pila, iniciando la cadena ROP
- la cadena ROP copia el payload completo de shellcode a una región de memoria ejecutable y salta hacia él
- el shellcode configura los hooks y parches necesarios antes de volver a la ejecución del juego y hace aparecer al jugador en la partida
- mientras el jugador patina dentro del juego, el host envía un archivo ejecutable al cliente, y el cliente lo guarda en el HDD
- una vez completada la transferencia del archivo, el shellcode parchea el kernel del cliente para usar la habibi key y arranca el ejecutable secundario transferido
- si no se cambia el color del LED, al usuario le cuesta notar el progreso hasta que de repente arranca otra aplicación
Xbox 360: THAW y el kernel 4548
- Tony Hawk’s American Wasteland para Xbox 360 también es vulnerable al desbordamiento de búfer en el nombre del gap
- el objetivo era explotar la consola en una nueva versión del kernel, pero sin un nuevo bug en el hypervisor era imposible
- en su lugar, fue posible combinar el bug de
strcpyde THAW con el bug existente del handler de system calls del kernel 4548 para crear el primer exploit de solo software para Xbox 360 - el hack anterior de King Kong en Xbox 360 usaba un archivo shader modificado para realizar una escritura arbitraria en la memoria del kernel y explotar el bug del handler de system calls
- este método requería abrir la consola y modificar el firmware de la unidad de DVD para usar un disco modificado de King Kong
- el bug del save game podía servir como otro punto de entrada para iniciar una cadena ROP
Firmas de archivos guardados en Xbox 360 y el papel de las consolas de desarrollo
- los archivos de guardado de juegos en Xbox 360 se firman con un par de claves RSA único para cada consola
- el almacén de claves de cada consola contiene la clave criptográfica usada para firmar los archivos guardados
- la razón por la que otras consolas pueden validar un archivo guardado es que la clave pública RSA está incluida en el encabezado del save file
- esa clave pública está a su vez firmada con otro par de claves RSA que solo posee Microsoft
- no se puede poner cualquier clave pública en el encabezado y hacer que pase
- para usar en otra consola un save file modificado arbitrariamente, se necesita el key store descifrado de alguna consola Xbox 360
- el punto de partida del hacking de Xbox 360 fue la filtración de una consola de desarrollo y del SDK
- como el código ejecutable estaba cifrado, no era posible encontrar bugs sin poder inspeccionar el código desde afuera
- la consola de desarrollo y el SDK proporcionaban la información necesaria para descifrar código ejecutable y hacer ingeniería inversa de la cadena de arranque, el hypervisor y el código del juego
Bug del handler de system calls 4548
- Xbox 360 tiene modo real del hypervisor y modo kernel
- el modo real del hypervisor es el modo con más privilegios
- en modo kernel se ejecutan el sistema operativo y el juego
- la CPU tiene, junto al caché L2, una unidad criptográfica encargada del cifrado y hashing de memoria
- en modo kernel, las páginas del hypervisor se ven como cifradas + hasheadas, y si se sobrescriben arbitrariamente la consola se detiene al acceder al hypervisor
- en modo real, los 32 bits superiores de la dirección física de 64 bits se usan para controlar el cifrado y el hashing
- aplicar la máscara
0x80000000.00000000permite acceder a memoria ignorando el cifrado y el hashing - donde el modo kernel puede proporcionar direcciones físicas al hypervisor, esos 32 bits superiores deben limpiarse obligatoriamente
- aplicar la máscara
- el handler normal de system calls usa la instrucción
slwipara desplazar el ordinal de la system call 2 bits a la izquierda, descartando los 32 bits superiores del resultado y usando solo un offset de 32 bits - el handler de system calls del kernel 4548 usa
sldien lugar deslwi- como
sldiopera en 64 bits, los 32 bits superiores de r0 también influyen en el cálculo del offset del índice de la tabla - la validación de rango del ordinal solo se aplica a los 32 bits inferiores de r0
- por ejemplo,
0x20000000.0000003Fpasa la validación de rango mientras genera un offset0x80000000.000000FC, lo que provoca acceso a memoria no protegida
- como
- se considera más probable que este cambio haya sido un bug del compilador que una modificación intencional del desarrollador
Configuración del exploit de Xbox 360
- si se sobrescribe la vista de memoria cifrada del hipervisor desde kernel mode, normalmente la consola se detiene, pero si se hace que el system call handler lea un function pointer desde una dirección con el bit de protección superior activado, puede leer el valor sobrescrito sin provocar un fault
- pasos del exploit
- cargar shell code en memoria y obtener su physical address
- modificar una variable del kernel memory manager para exponer la vista de memoria cifrada del hipervisor en un address range escribible
- sobrescribir el function pointer de la system call del hipervisor con la dirección de la secuencia de instrucciones
mtctr r4; bctr - poner un ordinal malicioso en r0 y, en r4, un valor con OR entre la physical address del shell code y la máscara
0x80000000.00000000 - ejecutar la instrucción de system call para que el hipervisor lea el function pointer sobrescrito y salte al shell code mediante
mtctr r4; bctr
- el exploit del archivo de guardado de THAW usa una cadena ROP de PowerPC
- se modificó el plugin de IDA Ida-Sploiter para añadir soporte de búsqueda de gadgets de PowerPC
- el exploit completo está compuesto por 24 gadgets ROP
- flujo completo de THAW en Xbox 360
- sobrescribir la return address con el primer gadget ROP mediante el buffer overflow del nombre del gap
- hacer pivot del stack pointer hacia la cadena ROP dentro del save buffer
- asignar memoria física para el shell code del hipervisor con
MmAllocatePhysicalMemoryEx - copiar el shell code con
memcpyy obtener la physical address conMmGetPhysicalAddress - mapear la vista de memoria cifrada del hipervisor para que se pueda escribir
- sobrescribir la dirección de la system call con la secuencia
mtctr r4; bctr - ejecutar
syscallcon el ordinal malicioso y la physical address del shell code - obtener ejecución de código en el hipervisor, cambiar el color del LED y parchear la verificación de firma RSA de ejecutables
- volver a la cadena ROP de kernel mode, mapear una carpeta del HDD con
ObCreateSymbolicLinky ejecutar un secondary payload sin firma conXLaunchNewImage
- este método puede obtener ejecución ROP con el bug de
strcpyde THAW en cualquier versión del OS de Xbox 360, pero la ejecución completa de código en el hipervisor solo es posible en el kernel 4548- si se descubre un nuevo bug del hipervisor, puede combinarse con este entry point para aplicarlo también a versiones más nuevas del kernel
Divulgación en 2024 y port a plataformas adicionales
- en 2024 se organizaron y publicaron los exploits de Tony Hawk
- el mismo bug de
strcpyexiste en 5 iteraciones de la serie Tony Hawk y en varias plataformas de consola y handheld -
PlayStation 2
- el exploit de RCE por red de THPS4 se portó a la versión de PlayStation 2
- con PCSX2 u otra consola y solo el disco de THPS4, se puede hackear la consola por la red
- el exploit envía uLaunchElf por la red y lo ejecuta cuando termina la transferencia
- después de eso, se puede cargar el instalador de FreeMcBoot o FreeHDBoot desde otro medio como una memoria USB
- el exploit de save game para PS2 tiene poca utilidad
- si ya hay una forma de copiar archivos a la memory card, se puede instalar FreeMcBoot directamente
- también se puede comprar una memory card con FreeMcBoot en Amazon por 15 dólares, o usar FreeHDBoot en una consola phat con network adapter
-
GameCube
- el exploit de save game de THPS4 se portó a la versión de GameCube
- no se portaron versiones de RCE por red ni de otros exploits de save game
- copiar archivos a una memory card de GameCube no es sencillo, y se han vendido memory cards con save files prehackeados en eBay por más de 50 dólares
- la versión de GameCube del juego Tony Hawk no tiene soporte de red, así que no se puede usar el exploit de red aunque se tenga network adapter
- como ya existen varios exploits por save game y no hay un hack persistente por software, muchos usuarios eligen un modchip
-
Windows
- también se creó un exploit de save game para THUG PRO, y el bug report se había enviado hace 7 años, pero en ese momento no había interés en corregirlo
- no se publica porque no aporta valor en Windows
- los juegos de Tony Hawk para PC tienen el mismo bug de
strcpyy son explotables - también hay otro bug de
strcpyexplotable en network play - se recomienda forzar ASLR y no ejecutar como Administrator
Material publicado
- el source code completo y los archivos de guardado parcheados están publicados en GitHub
- un solo bug de
strcpyterminó convirtiéndose en exploits de archivos de guardado en múltiples plataformas, RCE por red y un entry point de exploit solo por software para Xbox 360
1 comentarios
Opiniones en Hacker News
Lo más interesante de la clave Habibi es que el módulo de la clave pública difiere de la clave pública RSA de Microsoft en solo 4 bytes.
Un entero aleatorio de 2048 bits tiene una probabilidad bastante razonable de poder factorizarse de forma trivial; no sé la probabilidad real, pero se podría estimar aproximadamente en el orden de 2^-32.
Probablemente usaron un código que cambiaba al azar, o incrementaba, 4 bytes del módulo público, intentaba factorizarlo durante alrededor de 1 milisegundo y se detenía si tenía éxito.
Como resultado, es muy probable que el módulo público tenga muchos factores pequeños; y aunque un módulo RSA normalmente es exactamente el producto de dos primos, mientras sea coprimo con e, las matemáticas siguen funcionando aunque tenga más factores.
Si se tiene suerte y la implementación de RSA usa exactamente dos factores primos, como ya se sabe que un factor es 3, basta con dividir la clave pública entre 3 para obtener el otro factor primo.
Según Wikipedia, en la estructura de una clave pública RSA, N debe ser un semiprimo grande y e debe ser coprimo con φ(N); quien factorice N puede obtener la clave privada. En el contexto del hackeo de Xbox, si se hace que N sea divisible por el primo 3, el otro primo es N/3, así que ya se logró factorizar.
El código para firmar con la clave Habibi está en https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f.... Cambia los últimos 4 bytes a 0x89, 0x9c, 0x90, 0x6b, luego divide entre 3 y con ese valor genera una clave privada adecuada.
La aplicación consistía en dañar una clave pública con rowhammer y luego usar su factorización para crear una nueva clave privada correspondiente. Funcionaba con claves SSH y GPG, y para hacerlo práctico asumíamos cosas como conocer el contenido de la página que contenía la clave.
Las tasas empíricas de éxito según el tiempo de cómputo disponible están en la Figura 7; el tratamiento analítico está en la sección 3 y la explicación del método real en la sección 4.4.
https://www.usenix.org/system/files/conference/usenixsecurit...
Por ejemplo, con un código que prueba dividir por los primos del 2 al 499 y, si el valor queda en 1, declara éxito; si no, ejecuta Miller–Rabin 20 veces, en mi entorno bastaron unas 100 pruebas para factorizar por completo un entero aleatorio de 2048 bits.
Es difícil expresar lo absurdo que es este logro.
Softmodear una Xbox 360 mediante el nombre de un parque en un juego de Tony Hawk, y encima usando una cadena ROP de 24 etapas, es impresionante.
La breve elegía al hipervisor, el análisis conciso y práctico, y la mención inmediata a una botnet de x360 se sienten, en conjunto, como un golpe directo de nostalgia de Xbox 360 de primer nivel.
Es divertido lo de “con suerte será strcpy”. Originalmente debería haber sido strncpy, pero Tony Hawk, famoso por promover el equipo de seguridad, probablemente habría querido que se lo asociara con una copia de cadenas más segura.
Hace falta un manejo específico de la aplicación: si el origen no cabe en el destino, si se puede truncar, si hay que abortar toda la operación o si hay que reasignar el búfer de destino. strncpy casi siempre hace lo incorrecto.
Básicamente, casi nunca debería usarse strncpy; es para campos de tamaño fijo como
struct dirent { unsigned short inode; char name[14]; };.Incluso en esos casos, muchas veces los bytes de relleno deberían ser espacios en lugar de nul, y strncpy nunca debió haber entrado en la biblioteca estándar.
Al usar C/C++, me resultaban más fáciles que las funciones estándar de C: manejaban casos de falla comunes, como un búfer demasiado pequeño o un desbordamiento de entero, y todas las funciones devolvían un código de falla, así que también era fácil comprobar errores.
En este caso,
StringCchCopyW()oStringCbCopyW()serían mejores opciones que strcpy.Es una pena que este exploit también aplique a THUG PRO.
La escena competitiva de la serie Tony Hawk lleva casi 20 años muerta, salvo por el breve paréntesis del remake THPS1+2, y este mod todavía se juega.
El mod en sí ya tiene más de 10 años y parece que los desarrolladores originales se fueron, lo que explica por qué nadie quiso arreglarlo cuando Ryan lo reportó. Pero ahora este mod se vuelve difícil de usar por el riesgo de toma total de control de la PC.
Ojalá este artículo llegue a alguien con ganas de parchear el mod.
Ese código era solo para las versiones de consola, y la suposición de compilarlo para Windows no significaba Xbox Windows, sino herramientas, así que muchas partes se comportaban de manera completamente distinta.
Lo que parece ser un ícono de encabezado de sección antes del texto “So what's the habibi key?” en realidad es una sección de HTML details que se puede desplegar con un clic, así que si te interesa, conviene hacer clic
Lo que me da curiosidad es que, si es cierto que la clave Habibi se usaba exclusivamente en el grupo de consolas Linux para impedir el uso de contenido pirateado, ¿dónde, cuándo y cómo se publicó o se filtró la clave privada correspondiente?
El autor parcheó la diferencia de 4 bytes entre la clave de Microsoft y la clave Habibi para ejecutar un ejecutable “sin firmar”, que en realidad estaba firmado con la clave privada Habibi, así que parece claro que consiguió la clave privada
La clave privada puede recuperarse trivialmente a partir de la clave pública, así que no había gran cosa que publicar o filtrar
Básicamente era un pequeño CTF de criptografía enterrado dentro del hack original del archivo de guardado de 007: Agent Under Fire, y ese hack del archivo de guardado en sí también era casi un CTF bastante ofuscado. Parece que había tanto intención de fastidiar a quienes usaban copias pirata como un desafío dirigido a otros ingenieros inversos
Realmente genial. He hecho algo de decompilación de PSX, y ahí también hay muchas cosas parecidas
Curiosamente, cosas como
memmovese enlazan desde la biblioteca del SDK[0], perostrcpyes una función provista por la BIOSEn versiones posteriores del SDK se podía parchear esto para usar la versión de biblioteca, pero incluso hasta 1997 no estaba hecho así
0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...
Ahora que los juegos de N64 se están porteando a PC mediante decompiladores, me da expectativas
Podría aparecer la reacción de “pero estos juegos ya tienen versión para PC”, pero si recompilas juegos de N64 y cambias los efectos por texturas puras o efectos más simples en lugar de shaders, podrían correr casi en cualquier lado, incluso en dispositivos lentos como netbooks baratos de 2009
También existe un port de Super Mario 64 a la API 3DFX. Para juegos que acceden de forma compleja al framebuffer de N64, quizá haga falta OpenGL 3.3 para imitar ese microcódigo, pero si el motor ya corre muy rápido en equipos posteriores al Pentium III, no sería difícil ejecutar el resto con aceleración GL 2.1 e imitar solo algunas partes por software
He leído muchos análisis de exploits de este tipo en varias formas, y me haría feliz leer 100 más en el futuro
Parece un buen ejemplo de una mentalidad de seguridad equivocada en el desarrollo de consolas
La idea de “solo nosotros podemos usar los datos guardados, así que basta con parsear lo que escribimos nosotros” es común en consolas, pero es fundamentalmente errónea porque la gente puede preparar datos guardados fabricados artificialmente
Aparte de eso, las consolas no deberían tratar al usuario como enemigo, pero si de todos modos lo hacen, los juegos también deberían tener una mentalidad de seguridad acorde con esa postura
No sé cómo se podría impedir el hacer trampa en juegos online si no se limita lo que el usuario puede hacer
En defensa de Tony Hawk, él es skater profesional, no analista de seguridad
El tiempo limitado que pasó frente al teclado a fines de los 90 y principios de los 2000 seguramente no se dedicó a auditar buffer overruns, sino a hacer que el 900 McTwist se sintiera natural en el juego que pronto se convertiría en una serie icónica
Se me presentó la oportunidad de verificar una leyenda que había escuchado de niño. ¿Fue Tony Hawk la primera persona en lograr un 720?
Probablemente quiera decir “el primero registrado”, pero si alguien ya lo hubiera hecho, es muy probable que lo hubiera contado por todos lados, y cualquiera capaz de lograrlo probablemente habría sido skater profesional de todos modos