Archive for category Hack
Get lucky!

unlucky people miss chance opportunities because they are too focused on looking for something else. They go to parties intent on finding their perfect partner and so miss opportunities to make good friends. They look through newspapers determined to find certain types of job advertisements and as a result miss other types of jobs. Lucky people are more relaxed and open, and therefore see what is there rather than just what they are looking for.
Hola, hacker :)
Parece que alguien está intentando pasar un buen rato con el blag: tengo los logs del día 21 llenos de ataques de SQL injection.
Yo de momento no veo nada raro. Algún resultado?
Una consecuencia de los lenguajes no tipados
Esto va dedicado a todos aquellos que siempre vuelven a preguntarme en qué pelotas trabajo. Aquí tenéis un ejemplo, espero que por fin quede claro:
El problema de los lenguajes no tipados es que te puedes encontrar con errores tan sutiles como este. Validando un precio (básicamente un número), el programa hacía lo siguiente:
“123″ => Correcto
“-123″ => ERROR!
“0″ => Correcto pero no se usa
“” => Correcto pero no se usa
“123asd” => ERROR!
“asd” => Correcto pero no se usa <<<<<<===== WTF!?!?!?!
Debería haberme escupido un error en el último caso!
Trazando el código me encuentro que se comprueba y pone a cero tal que así:
if (isset ($this->price) && $this->price == 0) $this->price = NULL;
Por qué entra en el if cuando “asd” es claramente diferente a 0?
Porque en PHP, al estar comparando una cadena con un entero, se intenta hacer una conversión emplícita a entero de la cadena y al no poder, queda el if tal que asina:
if (isset ($this->price) && NULL == 0) $this->price = NULL;
Y ese NULL==0 se evalúa a verdadero por las reglas de comparación de PHP.
Vamos que he estado dándole vueltas un rato a esto, para que ahora la solución se base en añadir un carácter convirtiendo la comparación de igualdad en una comparación de identidad:
- if (isset ($this->price) && ($this->price == 0 || $this->type != ’s’)) $this->price = NULL;
+ if (isset ($this->price) && ($this->price === 0 || $this->type != ’s’)) $this->price = NULL;
12 palabras útiles para aprender en cada idioma
Hace tiempo decidí que un idioma con menos de 50 millones de hablantes no me compensaba el esfuerzo, a menos que fuera a tenerlo presente en mi vida el tiempo suficiente.
De todas formas, he encontrado que para cada idioma, es muy útil saber como se dice un conjunto muy reducido de términos desde el primer día. Vas a estar sólo durante 2 días en un país nuevo y no tienes tiempo para empezar a conjugar nada? Esta es mi lista personal:
- Sí
- No
- Hola
- Adios
- Gracias
- Por favor
- Perdone
- Izquierda
- Derecha
- Aquí
- Allí
- Cerveza (siempre útil)
Esta pequeña lista te permite empezar conversaciones con educación, entender algunas direcciones básicas que te puedan dar y por supuesto, pedir una birra en cualquier parte del mundo. Esencial.
A partir de este punto, si tienes más tiempo e interés, se puede continuar con los pronombres, los verbos ser y haber y conjugar alguna cosilla simple. Internet está lleno de recursos para esto.
- Curso de griego en MailXMail. Un buen comienzo.
Viajes y HowTo’s
Un saludo rápido desde el trabajo en Estocolmo para anotar aquí dos enlaces interesantes:
- WikiTravel
Una página en formato wiki donde encontrar información sobre la ciudad a la que quieres viajar. Reune mucha información interesante que normalmente hay que estar buscando individualmente, como información del lugar, como llegar, cosas que hacer, costumbres, etc… - Howcast
Un almacen de videos sobre “como hacer diferentes cosas” relacionados por categorías. Algunos útiles, otros con un toque humor.
Pero si es solo una tabla!
Building an online classified ad system would be easy, Noah argued. (As any programmer would tell you: “It’s one table!”)
Los 25 errores de programación más peligrosos
Según el estudio publicado por el insituto SANS con el apoyo de numerosas organizaciones, estos son los 25 errores más comunes que hacen de la informática un polvorín:
Interacción insegura entre componentes:
- Validación de parámetros de entrada inapropiada
- Codificación o escapado de parámetros de salida inapropiados
- No preservar la estructura de las peticiones SQL (Inyección de SQL)
- No preservar la estructura de la web (Cross-Site Scripting)
- No preservar la estructura de los comandos del sistema operativo (Inyección de comandos del SO)
- Transmisión en claro de información sensible
- Suplantación de identidad al hacer peticiones de información (Cross-site request forgery)
- Condiciones de carrera
- Filtrado de mensajes de error
Gestión de recursos arriesgada:
- No limitar las operaciones que ocurren dentro de los límites de un buffer de memoria (Buffer Over/Underflow)
- Control externo sobre datos críticos de estado
- Control externo sobre nombre de archivo o ruta
- Ruta de búsqueda no confiable
- No controlar la generación de código (Inyección de código)
- Download de código sin chequeos de integridad
- Cierre o liberación de recursos de manera inapropiada
- Inicialización inapropiada
- Calculos incorrectos
Malas defensas:
- Control de acceso inapropiado (autentificación)
- Uso de un algoritmo de criptografía roto o arriesgado
- Passwords imbuídos en el código (Hard-coded passwords)
- Asignación de permisos insegura a un recurso crítico
- Uso de valores aleatorios predecibles
- Ejecución de código con privilegios innecesarios
- Forzar contoles de seguridad del servidor en el lado del cliente
Personalmente, me he encontrado con casi todos ellos en algún momento y aunque algunos pueden resultar sencillos de identificar y resolver, otros pueden llegar a dar verdaderos dolores de cabeza.
El de los valores aleatorios me ha recordado uno de los comics de xkcd:
3 videos para encontrar la inspiración
A las puertas del 2009, os traigo una recopilación de 3 de los mejores videos que circulan por Internet para intentar cambiar las cosas un poquito en el nuevo año.
El primero ya lo hemos visto por aquí, tiene pinta de híbrido entre un video de la MTV y una charla de graduación universitaria con mucha intención:
El siguiente es ya un clásico de Internet: el discurso de Steve Jobs para los alumnos de la Universidad de Stanford:
El último de la lista, no podía ser otro sino este.
El último discurso de Randy Pausch, meses antes de que muriera de cancer de páncreas, lo cual no le impidió hacer la que considero de largo la mejor de las tres charlas y posiblemente una de las mejor expuestas y alentadoras que se hayan hecho nunca.
Lamentablemente, solo la he encontrado en su versión completa en inglés sin subtítulos, aunque la red es un lugar muy grande, nunca se sabe… aquí la tenéis:
The last lecture
Eso es todo por el 2008, sacad vuestras propias conclusiones.
Abandonware, el retorno de los juegos clásicos
Posted by shankao in Curiosidades, Hack on 23/08/2004
Ultimamente he estado jugando a unos cuantos juegos antiguos de 1995.
Es increible como han cambiado las cosas en 9 años verdad? Con juegos como estos, en la pantalla puedo ver entornos 3D realizados con ’solo’ unos pocos cientos de polígonos, sin efectos aplicados o muy simples, conceptos de juego diferentes, resoluciones mínimas, etc…
En cambio, siempre hay alguna joya que merece ser rescatada del olvido y jugada de nuevo… o si eres novato, por primera vez. Pero el caso es que los juegos de esa época son los más complicados de ejecutar en un S.O. moderno. ¿Por qué? Digamos que usan ciertas técnicas para aprovechar todas las posibilidades de los PCs de la época a los que el MS-DOS ya se les quedaba corto como sistema operativo.
En primer lugar, la mayoría de estos juegos necesitaban acceder a cantidades de memoria bastante mayores de las que MS-DOS era capaz de proporcionar en su forma normal. DOS es un S.O. que trabaja en modo real y por lo tanto, no tiene accedo a la memoria por encima de 1Mb de forma fácil. Si no sabeis lo que son los modos de trabajo del procesador, es mejor que hagais unas cuantas búsquedas en google en este punto.
Por lo tanto, para conseguir acceder a más de 1Mb de memoria bajo DOS, los programadores tuvieron que recurrir a trucos como EMS, XMS y extensores de memoria, que permitían a un programa de DOS trabajar en modo protegido y por lo tanto acceder a toda la memoria disponible.
Otro problema común en la época, era la falta de abstracción del hardware. Cada programador tenía que hacer versiones distintas de sus funciones para trabajar con tarjetas de sonido distintas o acceder a las características avanzadas de las últimas tarjetas de video. Aunque surgieron varios estándares (p.e. VESA, AdLib, Sound Blaster), seguirían surgiendo problemas hasta que no se creara una capa de abstracción de hardware completa.
En fin… digamos que con los últimos sistemas operativos, el asunto de la abstracción del hardware está mucho más superado. Aún así, los programas de dicha época, al apoyarse en dichos ‘trucos’ para poder competir entre ellos o simplemente para aprovechar las características hardware de un sistema en particular, son un poco más reacios a ser ejecutados en un Windows XP el cual no permite ciertas operaciones que podrían hacer inestable el sistema.
Qué soluciones tenemos para usar los programas? En primer lugar y tras ejecutarlos, podemos tratar de buscar pistas sobre su mal funcionamiento en los mensajes que nos escupen. Un mensaje del tipo ‘EMS no disponible’ simplemente se soluciona activando la compatibilidad con memoria EMS para el programa (botón derecho sobre el ejecutable, propiedades, memoria…).
Si aún así no podemos usarlo, podemos probar algún tipo de emulación: por ejemplo, podemos crear una nueva máquina virtual en VMWare o Bosch e instalar allí un MS-DOS 6.2 o la última versión de FreeDOS disponible (open source). Aún así, la mayoría de las veces no es necesario y solo tendremos que hacerlo para los casos más dificiles, modificando más y más opciones de compatibilidad para el resto.
Más información:
MobyGames, proyecto de catalogación de videojuegos
Home-of-the-Underdogs, uno de los mayores centros de recopilación de abandonware legal.
Running DOS Game On Windows XP by Bob Rogers
Running DOS Game On Linux by Bob Rogers
