Hola a todos, y bienvenidos al blog de desarrollo de Wii Pang.
En este pequeño rinconcito de ‘la internet’ iré proporcionando información sobre el estado de desarrollo de la vuelta de tuerca a este clásico donde los haya.
Entrando en materia, el proyecto pretende ser ambicioso, ya que no sólo consta de la propia implementación del Pang en la consola Wii, tarea ya de por sí peliaguda, si no que mi intención es la de facilitar a la comunidad unas herramientas (una biblioteca de clases en C++, para ser exactos) que permitan facilitar la creación de pequeñas (o medianas, vaya usted a saber) aplicaciones en dos dimensiones para la blanquita de Nintendo.
Esta historia surge de la libogc, que, junto con otras bibliotecas portadas por muchos programadores a lo largo del mundo, proporciona suficiente base como para poder desarrollar casi lo que se desee en una Wii, pero… a bajo nivel. Mi biblioteca (pendiente de recibir el botellazo de nombramiento aún) va a proporcionar unas clases de bastante más alto nivel, que abstraigan detalles pesados como pueden ser el la alineación de los datos, el relleno, el big endian … (detalles que se comentarán en otra entrada más adelante).
¿Motivación? ¿Por qué un Super Pang? Pues sencillamente, me encontré hace un tiempo un magnífico tutorial de Hermes (entuwii.net y elotrolado.net) en el que detallaba una introducción a la programación en Wii. Me dije, ¿y por qué no? A fin de cuentas, tengo un Proyecto Fin de Carrera que entregar. Y debo confesar que la idea de implementar un Pang (con un par de modificaciones, por ejemplo, ganchos oblícuos en lugar de sólo verticales) me vino por mi gusto por los clásicos, pero como un juego de plataformas 2D para Wii no daría jugo para controlar el WiiMote, me decidí por esta otra opción.
Por último, sólo comentar que espero que este blog sirva para que todo curioso sobre el desarrollo en Wii pueda aprender algo (o enseñar, que siempre se agradecen consejos), y que participo en el V Concurso Universitario de Software Libre.
Pronto comenzaré a publicar cosillas sobre el proyecto, al principio sobre los detalles de la programación en Wii, y más adelante, sobre el desarrollo de la biblioteca primero, y del juego después.
¡Saludos!
Damos comienzo a nuestro proyecto de Software Libre dedicado a la creación de un cliente de Twitter multiplataforma. Se trata de un proyecto que llevábamos un tiempo pensando en desarrollar y que para, de algún modo, obligarnos a trabajar en él hemos decidido inscribirlo en el 5º Concurso Universitario de Software Libre.
Os iremos manteniendo informados…
Filed under: Uncategorized
Nueva serie de entradas relacionadas con la ofuscación de código JavaScript y de diferentes técnicas que pueden ser utilizadas para explotar vulnerabilidades:
IntroducciónUna de las técnicas más usadas por los atacantes para explotar vulnerabilidades en los navegadores es la ofuscación de scripts.Los scripts que son ejecutados en la parte del cliente suelen estar escritos en Perl, JavaScript, VBScript, ofuscando el código se consigue complicar la tarea de comprender, estudiar o analizar la funcionalidad del mismo.Esto ha conseguido que sea una de las técnicas más utilizadas cuando se habla de malware desarrollado específicamente para objetivos web.El objetivo es transformar el código en algo totalmente incomprensible mientras se transfiere desde el servidor web hasta el navegador del cliente, pero siempre manteniendo su funcionalidad.Para dar un ejemplo real, vamos a utilizar una función en JavaScript encargada de calcular el factorial de un número y vamos a explicar cada una de los puntos que se ha de seguir para ofuscar correctamente el código de forma que quede totalmente críptico para un usuario pero sin que se vea afectado su propósito.Este código tiene un uso es sencillo, pasamos dos parámetros a nuestra función, y esta se encarga de mostrar el factorial para el valor dado.OfuscandoPara poder ofuscar nuestro código correctamente podemos seguir los siguientes puntos:
Si aplicamos estos apartados al código anteriormente descrito, legible y fácil de seguir la traza, obtendremos el siguiente resultado que realiza exactamente el mismo cometido.Como veis, el código queda completamente ilegible, y esta es una técnica muy usada para evadir las firmas de detección utilizadas por aplicaciones de seguridad como los IPS (Intrusion Prevention Systems), escáneres de Malware o las aplicaciones de filtrado, por mencionar algunos ejemplos.Pero esto es solo un pequeño ejemplo, podemos encontrarnos con casos en los que existan varios scrips ofuscados y tener variables que dependan de la desofuscación de otros scripts para realizar su cometido.Todo esto es relativo, pudiendo llegar a ser un proceso tan complejo como el atacante quiera.Usando iFramesNo deja de ser una página web HTML, con la peculiaridad de que permite insertar una página dentro de otra. Esto ha provocado que se convierta en una de las técnicas preferidas por los atacantes para inyectar malware en las aplicaciones web.Al ser tan flexibles permiten pasar desapercibidos ocultándose del resto de elementos en la página, convirtiéndose en una alternativa ideal para ocultar código javascript ofuscado que se aproveche de alguna vulnerabilidad inyectando su código al ser incrustado entre el resto de etiquetas HTML.Podéis ver un ejemplo aquí y aquí. Este último hace uso de la función JavaScript unescape() encargada de decodificar URL Encode Strings, en otras palabras se encarga de decodificar un parámetro que fue codificado con la función de JavaScript encode().Su funcionamiento consiste en encontrar parejas de 2 o 4 caracteres hexadecimales e intercambiarlos por su representación en Latin-1, de esta forma %20 es el equivalente al espacio, %21 una exclamación, %22 es el equivalente a la comilla doble, etc.Un ejemplo de las funciones sería:
El contenido del código anteriormente mostrado es en realidad el siguiente, pasando los caracteres codificados a su valor original obtendríamos lo siguiente. De esta forma se está utilizando un iframe para cargar un recurso externo.Web Based Malware KitsDesde aproximadamente 2005, se han ido sucediendo diversos packs de exploits que se aprovechan de vulnerabilidades en los navegadores y componentes flash para explotarlos y conseguir ejecutar código remoto.Operan aprovechándose de la técnica comentada anteriormente, redirigiendo la acción del navegador de la víctima hacia un servidor que esté ejecutando una copia del malware, de forma que al acceder a la misma este quede infectado si no se utiliza un antivirus actualizado.Además en cada nueva actualización que sacan suelen añadirse nuevas características que ofuscan aun más el código e implementen heurísticas de evasión para saltarse las firmas de antivirus. Se consiguen crear exploits dirigidos a determinados navegadores y sistemas operativos, y se incrementa brutalmente el porcentaje de éxito del ataque.Una vez la fase de infección y explotación ha sido realizada satisfactoriamente, se procede a la descarga de nuevo malware, sin que el usuario tenga conocimiento de ello, creando un nido de infección preocupante. En este momento la víctima ha sido comprometido sin darse cuenta.Un lugar donde podéis informaros más ampliamente sobre esto, es en el otro lugar donde escribo a veces, Malware Intelligence.Cross Site Scripting (XSS)Si hemos de hablar de una de las mayores vulnerabilidades en aplicaciones web usadas para propósitos maliciosos, esa es Cross Site Scripting o XSS para los colegas.Esta permite a un atacante alterar o modificar el código fuente de la aplicación, resultando en una ampliación del ataque y en la infección de un mayor número de usuarios potenciales:
Estas se producen cuando la entrada dada por un usuario es aceptada y no se valida, transmitiéndose al lado del cliente con una codificación incorrecta. Esta situación provoca que se ejecuten secuencias de comandos malintencionados.Normalmente suele aparecer en las páginas dinámicas que no suelen tener un control exhaustivo sobre sus salidas ni sobre cómo procesan internamente la entrada de datos. Para entenderlo supongamos que un atacante envía el siguiente código malicioso, cuando la víctima haga click sobre el vínculo se abrirá un enlace hacia la dirección apuntada junto con el código contenido entre las etiquetas script.El resultado podría ser una simple ventana de alerta mostrándote el típico mensaje de "XSS" al que todos les restamos importancia, pero también podría ser una combinación con cualquiera de las técnicas que comentábamos más arriba.
Cada objeto aprendido por Infant tendrá que ser descrito mediante una serie de tags que describan ese objeto por el profesor. Así por ejemplo para la la letra B, tendremos una descripción tageada como letra,mayuscula,latina,b. La idea es por tanto, que según se vallan introduciendo nuevos conceptos estos se jerarquicen de modo que finalmente tengamos una estructura como la siguiente que organiza todo el "conocimiento" adquirido por Infant: La finalidad principal de añadir esta estructura es que una vez aprendidos y organizados una serie de objetos/conceptos el sistema sea capaz de reconocer (mediante la creación de reglas) por si mismo nuevos objetos de una determinada categoría e incluso ser capaz (en un futuro muy lejano :P) de especificar de qué objeto se trata a partir de la generalización y con la ayuda de fuentes de datos externas (digamos wikipedia o google images)...
Cuando entré en la carrera se estaba constituyendo la Asociación de Desarrollo de Videojuegos de la Universidad de Cádiz (ADVUCA). Como os podéis imaginar, era un tema que me interesaba muchísimo y asistí emocionado al taller que organizaron sobre desarrollo en Nintendo DS con PAlibs. Este fue uno de mis primeros pasos en la programación
Si antes me quejo de lo malo que es Python-FUSE para depurarlo y para hacer unidades de test, antes me encuentro con otro con el mismo problema :-PBindings de FUSE para python hay varios (eso ya lo sabia) y escogí Python-FUSE aparte de por ser el mas famoso y el "oficial" (o al menos es del unico que hay documentación en la pagina de FUSE) porque ya habia paquetes en Ubuntu. Lo que yo no sabia es que otra de las alternativas (fusePy) tenia paquetes dentro de la CheeseShop (si, asi se llamaba hasta hace poco el repositorio de paquetes oficial de Python antes de "profesionalizarse"), y por lo que parece esta alternativa no solo es mas "pythonica" que Python-FUSE sino que ademas es mas completa respecto a funcionalidad de bajo nivel, y para muestra un boton:>>> from fs.memoryfs import MemoryFS>>> from fs.expose import fuse>>> fs = MemoryFS()>>> mp = fuse.mount(fs,"/mnt/my-memory-fs")>>> mp.path'/mnt/my-memory-fs'>>> mp.unmount()Si con esto no es mas facil el hacer las unidades de test sin necesidad de hackeos que baje FSM y lo vea. El problema viene entonces de tener que rehacer PirannaFS usando como base estos nuevos bindings o si hacer PirannaFS compatible con los dos, asi que quizas lo mejor sea estudiar previamente si realmente sera rentable o no, y leyendose el codigo no creo que baste. No se, otra alternativa podria ser el hacerme algun otro sistema operativo (¿otro mas?), pero FullFAT no tiene bindings en Python (aparte de que queria usar la libreria para "entrenarme" para el paso a C++ de PirannaFS) y no he encontrado nada de bindings de Ext3 en Python, aunque sin lugar a dudas estaria interesante el hacerse una implementacion completa de Ext3 en Python (para chulo, yo :-P ). ¿Vosotros que opinais? ¿Reciclaje? ¿Reimplementación? ¿Mirar para otro lado y hacer como que no he visto esto? :-PAl menos, de regalo me he encuentrado que CUSE, el hermano pequeño y marginado de FUSE para desarrollar drivers de dispositivo en espacio de usuario (el tio que lo desarrolló se dio cuenta que solo hacia falta añadir dos IOCTLs a FUSE para tener soporte para poder escribir drivers genericos fuera del kernel...) y del cual a casi nadie parece importarle (o al menos no he visto ningun proyecto importante o ni siquiera una pagina con documentacion)... ¡¡¡me encuentro con que han desarrollado unos bindings para Python!!! :-DQuizas empezase PirannaFS porque CaOS (mi propio sistema operativo que llevo diseñando desde que tenia 10 años) se me hacia muy grande, pero parece que todo el universo se esta conspirando en que lo saque adelante... :-)
Nota mental: plantearme hacer de proyecto para el año que viene o una maquina del tiempo o un replicador de cuerpos o diseñar una droga que permita alterar la percepcion del tiempo sin los efectos secundarios de la cocaina y que pegue mas fuerte por las mañanas que un cutrebull del Lidl... la falta de tiempo es acuciante, y ahora que se acercan los examenes creo que la mejor opcion va a ser dedicarme a la meditacion tibetana, a ver si asi consigo concentrarme...Quejas varias aparte, pequeño resumen de en lo que he estado perdiendo el tiempo ocupado las ultimas semanas:Para empezar, como ya puse en mi anterior post he empezado a realizar baterias de test para el sistema de archivos. Por un lado me hacia falta aprender a hacerlas, porque es algo que siempre he estado dejando de lado, y aunque no ha sido pan comido lo cierto es que no ha sido tan dificil como pensaba, pero la razon mas importante para hacerlo era el tema de difundir el proyecto, porque siendo un proyecto tan complejo y "delicado" (nadie quiere poner sus datos en peligro, y bastante ya me esta dando por [autocensurado] el Ext4 en el Ubuntu del trabajo poniendose en modo solo lectura cuando le doy un poco de caña por un error del kernel respecto a los timeout en discos lentos y antiguos... ¬¬) se necesitaba algun metodo para controlar la evolucion del proyecto y sobretodo para evitar regresiones. Y si, tengo que reconocer una cosa: funcionan, y mucho mejor de lo que pensaba. Tuve bastantes problemas a la hora de realizarlo por la forma en que esta diseñado python-fuse (no se si seria mejor arreglarlo o rehacerlo de cero...) pero lo cierto es que consegui que funcionara, y cuando despues de arreglar unos pequeños fallos que me encontre en la implementacion vi esto[piranna@Tontodelculo:~/Proyectos/FUSE/PirannaFS/src]> cat ../test/error.log ...............----------------------------------------------------------------------Ran 15 tests in 4.176sOKrealmente se me puso una sonrisa de oreja a oreja :-DPero mas interesante que esto fue cuando leyendome las especificaciones del OpenGroup vi algo que me dejo totalmente desconcertado: en readdir especifica que los famosos . y .. solo deben ser mostrados si el sistema de archivos en cuestion tiene referencias explicitas a ellos, cosa que no es el caso (y de hecho siempre me ha parecido una tonteria si ya sabemos tanto cual es el directorio actual como cual es el padre). Sin embargo en todos los ejemplos y documentacion que he visto los ponian explicitamente a mano. ¿Que hacer, saltarse el estandar, o seguirlo fielmente a pesar de que luego al listar el directorio se vea raro? Al final, como no sabia si la lista de correo del concurso podria servir para esto (apenas acababa de comenzar a usarse y esto era una pregunta muy especifica y hasta cierto punto yo entendia que seria cierta ventaja si alguien me ayudaba) asi que pregunte a mis colegas de AlcorconWireless, y como suele suceder en estas cosas mi amigo Dani (que al final le voy a tener que meter en los titulos de credito por toda la ayuda que me esta dando :-P ) dio con la mejor solucion:mas friki.. activa una opción para verlos o para no verlos.. jajajaajaEsa es la diferencia entre un ingeniero y uno que presume de serlo teniendo apenas la mitad de los creditos aprobados. Simplemente brillante.En fin, la cuestion es que aunque apenas tengo tiempo sigo sacando las cosas adelante, solo espero que con el trajin que llevo no termine implosionando por el estress :-P Espero a ver si para el proximo post ya tengo terminados las unidades de test, porque iba a haber hecho una release especial para Halloween y lo cierto al final ha sido que hacia una semana que no encendia el PC de casa... :-P
Bueno
Tras una revisión sobre la elicitación de requisitos, y con el documento de análisis de requisitos casi terminado, va siendo hora de ir preparandose para la implementación.
Empezaré por la base de datos y la documentación de las tecnologías que voy a utilizar, pero primero toca repasar conceptos sobre las BBDD y las formas normales.
En cuanto empieze con la implementación, crearé el espacio correspondiente en la forja donde se podrá ver la evolución del código del proyecto. Hasta entonces queda esperar un poco…todo a su tiempo
In this entry I will explain the manner to work with images with Onyx Illusion.This example shows the direct way of image loading from the disk, without content manager.The engine uses ...
Y esto es lo que ve Infant cuando le enseñan una "A":I|L|V|P|X|Y|X|Y 7|0|0|0|6.50572125468138e-15|98.8372093023256|45.0|0.0 7|0|0|1|45.0|0.0|58.75|3.48837209302326 7|0|0|2|58.75|3.48837209302326|100.0|98.8372093023256 7|0|0|3|100.0|98.8372093023256|85.0|98.8372093023256 7|0|0|4|85.0|98.8372093023256|72.5|69.7674418604651 7|0|0|5|72.5|69.7674418604651|26.25|70.9302325581395 7|0|0|6|26.25|70.9302325581395|13.75|100.0 7|0|0|7|13.75|100.0|6.50572125468138e-15|98.8372093023256 7|1|0|0|7.65378971138986e-15|97.2222222222222|46.4285714285714|0.0 7|1|0|1|46.4285714285714|0.0|100.0|100.0 7|1|0|2|100.0|100.0|7.65378971138986e-15|97.2222222222222 Que vienen a ser los vectores que forman cada uno de los niveles de detalle (columna L) siendo el 0 el contrno exterior y el nivel 1 el triángulo interior.