Diferencia entre un crash y un exploit

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8286
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

Diferencia entre un crash y un exploit

Mensaje por largeroliker »

Publicado por wololo en wololo.net y en el foro de dark-alex.org.
Recuperado gracias a Alek, webmaster de dark-alex.org
Traducción del inglés por largeroliker


Éste es un artículo para ayudaros a distinguir una vulnerabilidad exploitable (por ejemplo, el GripShift de MaTiAZ) de un simple crash no explotable (o al menos, no lo suficiente), como el de Phantasy Star de yyoossk. Podría ser visto como un tutorial sobre "cómo buscar un exploit de partida guardada de PSP"

Si, como yo, desafortunadamente quieres liberar tu PSP 3000 o Go, esto es parecido a cómo ocurre en los sitios dedicados a PSP.

De vez en cuando, alguien aleatoriamente postea con la "idea" de cómo liberar la PSP o, con suerte, llega de repente con un savedata que crashea la PSP, con la esperanza de que sea de utilidad. Reportar un crash es hoy día una buena idea, ya que son el primer paso paraa un exploit. Y si no vale para ello, al meeos ayuda a Sony a mejorar su firmware (xD)

Recientemente, un tipo de nick yyoossk intentó reproducir lo que MaTiAZ había hecho con GripShift en la demo japonesa de "Phantasy Star Portable". Uoh, un exploit en una demo, estaría bien, no hay necesidad de comprar caros UMDs!!! Es por eso por lo que decidí darle una oportunidad. Intentaré explicar aquí por qué este crash es sólo eso, un crash, y posiblemente nunca pueda ser aprovechado con un exploit.

==
NOTA del traductor: Nótese que en este apartado ya se ha quedado anticuado, actualmente podemos encontrar el Half Byte Loader de m0skit0 y el propio wololo basado en la demo de Patapon 2. Más información en el foro de Noticias PSP...
==

Compararé el crash de Phantasy Star Portable con lo que ocurre con el exploit de GripShift. Antes de comenzar, tienes que saber que no intento ser el mejor hacker o desarrollador del mundo. Sólo estoy un poco por encima del nivel de "completo noob" pero con la suficiente experiencia en ESTO para comprender lo que veo en mi pantalla. Así que este texto podría ser inapropiado en algunas partes.

Para leer este artículo, necesitas tener un buen conocimiento de conceptos básicos de programación como variables, direcciones y arrays (cadenas, o cómo lo queráis traducir XD). También deberías tener una ventana del navegador abierta con la lista de comandos de ensamblador de MIPS. En realidad no hace falta conocer ensamblador MIPS si sabes lo más básico de programación, pero seguro que ayuda a tener una idea general de qué lenguaje ensamblador es.

Los fundamentos de un exploit de partidas guardada

La mayoría de los exploits de partidas guardadas confían en el concepto de "buffer overflow" o "desbordamiento de búffer", que consiste en escribir más datos en el array que el que deberías. Por ejemplo, si tu tienes un array de tamaño 10, e intentas escribir 11 elementos en ñel, tendrás un desbordamiento de búffer de 1 elemento. Lo que ocurre en ese caso es que escribes algo en memoria que no deberías, y esto podría dar resultados interesantes de los que hablaremos más tarde. Para más información sobre desbordamientos de buffer, por favor leed éste artículo (en inglés).

Ahora, una manera muy empleada para buscar desbordamientos de búffer (en las partidas, pero no únicamente) es poner una cadena muy larga en alguna parte. Las cadenas normalmente se representan como arrays o chars, y son fáciles de identificar en saves descifrados. No puedes saber con facilidad qué números representan la cantidad de monedas de oro que tienesn en tu inventario, pero es muy fácil buscar "wololo" en el archivo.

Una vez la cadena se ha localizado, el primer paso es poner un nombre muy largo en ella. Es lo que MaTiAZ hizo con GrpShift ("Spartaaaaaaaaaaa"), y posiblemente lo que produjo el crash de Phantasy Star también.


Imagen


Por supuesto, no puedes hacer esto a través del juego en sí (la interfaz no te permitiría poner más de, pongamos, 10 caracteres), así que tienes que descifrar tu partida, editarla y volverla a cifrar. Una herramienta como el savegame-deemer es muy útil en estos casos, ya que te permite trabajar directamente en partidas cifradas sin preocuparte de descifrarla.

Así que fundamentalmente, pones algo de basura en tu partida guardada, e intentas a ver si esto hace que el juego crashee. En la mayoría de los casos, el juego no crahseará, pero simplemente te dirá que tu savedata es inválido (típico mensaje de Datos corruptos o no válidos). Fin del juego, no encontrarás ningún exploit con este juego y este método ( no necesariamente significa que el juego no tenga ningún agujero, sólo que necesitas pensarlo y currarlo más, pero eso está más allá de lo que quiero explicar en este artículo)

Pero, ¿y qué si el juego crashea cuando carga la partida?. Bien, significa que algunos desarrolladores no hicieron bien su trabajo, y hay una vulnerabilidad en el juego. NO SIGNIFICA QUE HAYA UN EXPLOIT AÚN, por ahora es sólo un bug. Para ver si es interesante, tienes que ejecutarlo con PSPLink y analizar el volcado de error.

Ejecutando el juego con PSPLink

Aquí es donde la dificultad comienza. Para este paso necesitarás una PSP con CFW y PSPLink instalado. No ahondaré en los detalles de instalación de PSPLink ya que se pueden encontrar con facilidad.

Aquí tienes un tutorial bastante completo

Necesitamos utilizar PSPLink como plugin ya que ejecutaremos un juego. Para ello necesitas tener tanto usbhostfs.prx como psplink.prx en tu carpeta seplugins, y tenerlos activados en en game.txt. No daré más detalles ya que necesita la misma instalación que el RemoteJoy, menos por la parte del control renoto :p

Una vez esté todo instalado, ejecuta usbhostfs_pc y pspsh desde tu ordenador, conecta la consola al ordenador por USB y ejecuta el juego.

Imagen


Si todo va bien, usbhostfs_pc debería mostrar un "connected to device" ("Conectado al dispositivo") y pspsh un "all modules loaded" ("todos los módulos cargados") y luego un comando "/host0:>"

Imagen


Cuando cargues la partida, el juego crasheará, y deberías ver un volcado de memoria mostrado en pspsh, como abajo

Imagen


¿Qué buscamos?

Ahora viene la pequeña dificultad sobre ensamblador. PSPLink nos muestra el estado de varios registros justo antes del crash. Los registros son simplemente "integers" de 32 bits usados en cualquier programa, y que pueden representar cualquier cosa (caracteres, direcciones en memoria, integers...) dependiendo de cómo los interprete el programa.
Lo que queremos cuando escribimos un exploit es poder saltar a una posición arbitraria de la memoria. Desafortunadamente, no hay muchas maneras para hacer esto. La única solución que conozco para esto es sobreescribir los contenidos del registro llamado "$ra". ra significa "return address" ("dirección de retorno"), así que comprende por qué es tan importante. Aquí es donde el código vendrá cuando acuda a una subrutina, con el comando "j $ra" (jump [saltar] a $ra). $ra por sí sola normalmente consige sus datos de $sp, así que si podemos manipular los datos relacionados com $sp, es también una buena señal.
Los otros registros no son inútiles, son los que eventualmente rellenen los contenidos de $sp y $ra, pero eso ya es demasiado complejo para explicarlo aquí (y, honestamente, no sé demasiado sobre eso además de que necesita un análisis detallado del programa, cosa que no voy a hacer)

Comparando el crash de GripShift (por qué funciona) y el crash de Phantasy Star (por qué no funciona)

Comparemos nuestros dos crash.

Imagen


Ponemos muchas letras "a" en el nombre de los jugadores, cosa que vemos en el reporte del crash ya que el valor de $ra es 0x61616161. Esto es un dato interesante ya que 61 es el valor hexadecimal de "a": bingo, básicamente hemos encontrado una forma fácil para saltar a una localización arbitraria en memoria. Lo que queda es reemplazar "aaaa" con una dirección normal, para lo que usaremos un poco de código. (Notad que edité el POC original de MaTiAZ para hacerlo crashear aparte de ejecutar código)

El crash de Phantasy Star:

Imagen



Vemos algunos "61" aquí y allí, pero nada interesante en $sp o $ra. Es un muy mal comienzo. Pero todavía podemos echar un vistazo al código, ver si esos $a1, $a2 o $a3 hacen algo bueno.

Imagen


Nada parece cambiar algo en $sp, el código salta una vez, dos, meh...
Es muy complejo, normalmente es ahora cuando te cansas y empiezas a buscar agujeros en otro juego.

Así que, ¿el crash de Phantasy Star no vale para nada?

No exactamente, es un bug, así que puede haber una manera para exploitearlo, pero cuando un salto no es obvio pierdes menos tiempo buscando un crash en otro juego, la verdad.
Buscar un salto que puede que nunca se de no es divertido y puede llevarse cientos de horas, así que no vale la pena (si deseas hacerlo, llegarás más lejos descifrando el firmware y buscando exploits en el kernel)

Esto es muy complejo para mí, ¿no hay otra manera que me diga si un crash es bueno o no?

Bueno, primero usa tu cerebro. sabes que la scene PSP ha trabajado mucho, cuando alguien llega con un exploit potencial puedes estar seguro que alguien te dará una portunidad si vale la pena. Si después de unas pocas semanas no hay una discusión "seria" sobre el fallo (con código de por medio o archivos POC) deberías perder un poco la esperanza.
Además, en este caso específico, hay otra señal que tampoco funcionaría: si fueran tan fácil como el exploit de GripShift, el crash ocurriría cuando el nombre de usuario se cargara. No es el caso, como puedes ver el nombre del jugador se muestra correctamente después de cargar la partida.


Imagen


Así que la demo de Phantasy Star tiene una comprobación de seguridad en la longitud del nombre del jugador. Esto no es una prueba de que el crash es inútil, pero sí un buen punto para saber que no puede ser tan fácil como el de GripShift.

Personalmente creo que es bueno reportar un crash como hizo yyoossk, su reporte fue detallado y aportó todos los archivos para reproducir el fallo, cosa que me hizo querer probarlo (eso, y que era una demo a la que cualquiera tiene acceso). Si hubiera docenas de reportes como ese todos los días, ¡algunos de ellos es muy posible que contengan agujeros de utilidad!
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Diferencia entre un crash y un exploit

Mensaje por m0skit0 »

Este tutorial es la hostia, lo leí de pi a pa hace tiempo (cuando wololo aún sabía más que yo :lol: ). Todos los que estén interesados en los exploits deben leerlo sí o sí.
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8286
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

Re: Diferencia entre un crash y un exploit

Mensaje por largeroliker »

Yea, es muy bueno, lo mío me costó traducirlo (ya sin Google translate, ya que lo traduje mientras estaba sin conexión :))

Saludos! ;)
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

Avatar de Usuario
Rasta
Experto
Experto
Mensajes: 811
Registrado: 03 Sep 2009, 12:28

Re: Diferencia entre un crash y un exploit

Mensaje por Rasta »

Gracias por la recuperacion, gran tuto si señor, cuando tenga tiempo intentaré crashear el GT PSP, es compejo pero no tanto como parece, ya que cuando juegas notas que a veces a anomalias en el sistema del juego, creerme que me paso horas y horas en el... Si consigo algo, m0skito contaré contigo??.

Avatar de Usuario
Kravenbcn
Administrador
Administrador
Mensajes: 16291
Registrado: 01 Sep 2009, 21:27
PSN ID: Kravenbcn
Twitter: Kravenbcn
Ubicación: Barcelona
Contactar:

Re: Diferencia entre un crash y un exploit

Mensaje por Kravenbcn »

Gran tuto de wololo, gracias por la traducción larger :oki:
No te pierdas nada, sigue a DaXHordes en Twitter, Facebook, Google+ y Youtube

Imagen
¿Quieres formar parte del equipo de DaXHordes.org? Esta es tu oportunidad.
PS3 · PS Vita · PSP

Avatar de Usuario
fidelcastro
Moderador Global
Moderador Global
Mensajes: 2472
Registrado: 04 Sep 2009, 18:49

Re: Diferencia entre un crash y un exploit

Mensaje por fidelcastro »

gran tuto si señor, abra que leerlo detenidamente, muy buen trabajo larger :oki:
Imagen

La verdad os hará libres (Juan 8:32). Y la mentira creyentes.

Avatar de Usuario
pspCaracas
Moderador Global
Moderador Global
Mensajes: 3080
Registrado: 03 Sep 2009, 03:29
Ubicación: Buenos Aire - Argentina
Contactar:

Re: Diferencia entre un crash y un exploit

Mensaje por pspCaracas »

Interesante...y no es tan complicado como parece, creo que es algo más de armarse de paciencia y probar :P
http://farm3.static.flickr.com/2497/3983880148_f5ae0aaab2_o.png

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Diferencia entre un crash y un exploit

Mensaje por m0skit0 »

Rasta escribió:Si consigo algo, m0skito contaré contigo??

Llegado el caso, claro que sí.
Imagen

kachin
Novato
Novato
Mensajes: 7
Registrado: 09 May 2010, 06:50

Re: Diferencia entre un crash y un exploit

Mensaje por kachin »

este tuto yo ya lo había traducido en otra web y es un copy paste de la traducción que hice no me molesta que lo cuelguen aquí pero por lo menos ten la decencia de
pedir permiso ya que este tuto lo pegue con el seudónimo de Lord K desde hace ya un año y me cuesta creer que hayamos usado los mismos criterios de traducción... no pongo el link pues seria hacer spam

Avatar de Usuario
Kravenbcn
Administrador
Administrador
Mensajes: 16291
Registrado: 01 Sep 2009, 21:27
PSN ID: Kravenbcn
Twitter: Kravenbcn
Ubicación: Barcelona
Contactar:

Re: Diferencia entre un crash y un exploit

Mensaje por Kravenbcn »

Campeón, antes de decir que es copy/paste leelo y compara...

Por poner un ejemplo, los dos primeros párrafos:

Tuyo
Si tu, eres como yo, querrás que la PSP 3k sea hackeada, y seguirás atentamente en varias paginas dedicadas a la PSP lo que pasa en la Scene.

Cada determinado tiempo, alguien sale con una nueva “idea” de cómo hackear la PSP, o en el mejor de los casos, Alguien con un savegame modificado que crashea la PSP, con la esperanza de que sea útil. Reportar algún crash e bueno, pues estos son el primer paso a un exploit, y si no es el caso ayudan a Sony a mejorar su producto.


Larger
Si, como yo, desafortunadamente quieres liberar tu PSP 3000 o Go, esto es parecido a cómo ocurre en los sitios dedicados a PSP.

De vez en cuando, alguien aleatoriamente postea con la "idea" de cómo liberar la PSP o, con suerte, llega de repente con un savedata que crashea la PSP, con la esperanza de que sea de utilidad. Reportar un crash es hoy día una buena idea, ya que son el primer paso paraa un exploit. Y si no vale para ello, al meeos ayuda a Sony a mejorar su firmware (xD)


Eso es copy/paste????? Que baje dios y lo vea... :roll:


Digo yo que si ambas son traducciones del mismo tuto se tendrán que parecer, no te parece?
No te pierdas nada, sigue a DaXHordes en Twitter, Facebook, Google+ y Youtube

Imagen
¿Quieres formar parte del equipo de DaXHordes.org? Esta es tu oportunidad.
PS3 · PS Vita · PSP

Responder