Entradas

Te recuerdo, 4m4nd4

  Sentado a la sombra artificial de un árbol sintético, JM71 se dispuso a hacer algo que jamás se le había ocurrido con anterioridad: pensar en el pasado. Los avances tecnológicos y la creciente incertidumbre sobre el futuro de la raza humana habían centrado el foco de atención de la educación en el futuro. Nunca se llegó a saber si el pasado estaba regido por leyes o si acaso era absolutamente azaroso pero ya no importaba ya que de un momento a otro los tópicos se habían desplazado desde Walter Benjamin, Karl Marx y otros, hacia qubits, entrelazamiento cuántico y válvulas moleculares. En esas circunstancias, la tarea que se estaba proponiendo JM71 no era para nada trivial. Solo guiado por su imaginación creó un pasado lejano, intentando emular en su mente como sería todo allá por los remotos años 2000. Se imaginó a una sociedad que no poseía las respuestas a todas las preguntas y tembló ante la idea de vivir en una época en donde la dirección de la entropía todavía no había sido m...

Mi tesis de grado en Ingeniería Informática

Más de una vez me han preguntado, sobre todo estudiantes avanzados de la carrera, respecto a mi tesis de grado de Ingeniería Informática. Si bien las preguntas generalmente varían, hay un interrogante constante: cuánto tiempo me llevó hacer la tesis. Los curiosos suelen sorprenderse pero nunca sé bien que responder. Entiendo su sorpresa: hacer una tesis suele ser un evento importante en la vida de una persona, no puede ser que esa persona no tenga presente cuanto tiempo le llevó. El objetivo, entonces, de este artículo es ordenar mis ideas sobre el papel para que la próxima vez que alguien me pregunte pueda darle una respuesta corta y una referencia a este artículo en caso de que realmente está desesperada por saber más. Disclaimers  1. Los nombres reales fueron reemplazados por una sugerencia propuesta por el sgte. comando: $ date +%s | sha256sum | base64 | head -c 6 ; echo 2. La tesis no la hice solo, la hice con mi colega Gonzalo Pallotta y con mi colega Héctor Klikailo...

Neoludismo

Probablemente suene un poco Stallman-ista o neoludita pero no importa, quiero compartir unos pensamientos: Se ha dicho que el futuro de una tecnología consiste en su capacidad de brindar un camino de huída. Se ha dicho, también, que esto no siempre fue así, que durante un breve espacio de tiempo y hace unos 30 años lo digital era una excelente herramienta de la contracultura para crear un futuro más inclusivo, justo y humano. La extracción de enormes beneficios fue quien llevó nuestra capacidad de acción a otros lugares. Estos lugares de poder son los que, por ej., mutan todas nuestras preguntas acerca de la ética en divertidas paradojas filosóficas. Todo esto nos debería implantar la necesidad de pensar: no deberíamos dejar que la creatividad, la curiosidad o el raciocinio se vean limitados por la existencia o no de beneficios económicos para quienes nos brindan esas tecnologías. Kant basó su imperativo categórico en nuestra habilidad para razonar y ese es un punto: la tecnología...

Fucking Call Back Verification

Estos días me encontré con una e-zine argentina llamada "Minotauro" que salió entre los años 1994 y 1997. Abarcando tópicos como el hacking, phreaking, virii y cracking, la e-zine fue escrita por columnistas con nombres como Dr. Retro, Zarathustra, trurl, Lapidario o Drako. El artículo que voy a compartirles a continuación fue escrito por este último y aunque es totalmente inútil para los días que corren, me parece interesante el reflejo de los "problemas" de la época y el estilo de redacción adoptado. Claro que podría dejarles un link pero ¡Algo tengo que escribir acá, che! El texto lo reproduzco tal cual lo copié, agregándole los acentos que se perdieron por cuestiones (sigh) de encoding. El artículo en sí: Bueno, este tema es bastante sencillo.. Antes que nada expliquemos lo que es el Call Back Verification y como es que funciona.. Bueno, el Call Back es un modo de validación automática.. el motivo de esto es la supuesta despreocupación del operador d...

Creador de contenidos Responsable

Como comentaba en una entrada anterior, me embarqué en enseñar VB6 y FoxPro9 (Lo escribo todo junto para evitar gastar espacio nombrándolos) a un chico que debe esas materias en su secundaria. Este chico me trajo un apunte sobre ADOs que en una parte tenía unas tablas en Microsoft Access que poblaba con nombres de profesores bastante peculiares. Gracias al ego de su profesor que escribió su nombre en el margen inferior de cada hoja, pude corroborar que ninguno de los profesores que aparecía en la tabla era él, por lo cual debí googlear porque a alguien se le ocurriría poner "Córdoba Saavedra, Javier" como profesor y no usar algún placeholder común como John Doe. Así fue que me encontré con un puñado de sitios que tenían el mismo material, robado originalmente a quien sabe quien. El inconveniente es que los ejemplos contenidos en este material siguen algunas malas prácticas de programación, o, no están todo lo bien codificado que uno podría desear y eso es un gran problema. A...

VB6 en el siglo XXI

Tengo que dar unas clases particulares de programación. Lo que en primer momento pensé que sería C, resulta que será VB6.0 y FoxPro. Para la hora del desengaño ya había confirmado mi disponibilidad y no me gusta ser una persona que rompe compromisos. En otra ocasión podríamos conversar sobre como es que hay gente que sigue enseñando tecnologías innecesarias y obsoletas (Microsoft considera a VB6 como lenguaje legacy desde el 2008) argumentando todo tipo de absurdos. Por ahora, me monto una VM con Windows XP y me pongo a descargar compro VB6. Esto me da tiempo para leer algunas cosas por el camino: VB6 fue la segunda y última versión de la suite de desarrollo Visual Studio de Microsoft, antes de la plataforma .NET. Visual Studio también incluía Visual J++, un lenguaje que le costó a Microsoft millones de dólares a pagar a Sun Microsystems ya que era una versión propietaria e incompatible de Java. ¿Por qué VB fue discontinuado? Porque no fue concebido como un lenguaje de desar...

Introduccion a x86 ASM - Registros

Imagen
Assembler no es un lenguaje. Es una familia de lenguajes dependientes de la arquitectura de los procesadores. Esta familia de lenguajes es fundamental en ingeniería inversa. Me fascina el concepto de ingeniería inversa aunque aún soy un lego casi total en la materia: esta guía también me sirve a mi. Por otra parte, demasiados desarrolladores no saben lo que es la ingeniería inversa y demasiados desarrolladores piensan en Assembler como si fuera un lenguaje de programación obsoleto. Esta serie de entradas, inspirada en esta otra Guía de la Universidad de Virginia pretende ser una guía introductoria al lenguaje assembler usado en los procesadores Intel x86. Como guía introductoria cubre solamente una pequeña porción (pero útil) de las directivas e instrucciones disponibles. Así como existen un lenguaje ensamblador para cada arquitectura, existen varios lenguajes para generar código máquina para procesadores x86. Esta guía utiliza el assembler de Microsoft Macro Assembler (MASM) , q...

Basic clean of Linux boot-up

Un comando no tan conocido pero bastante útil que viene incorporado al denostado systemd, es systemd-analyze. Este comando permite conocer detalles respecto al tiempo que tomó el último boot de la PC. Y si bien tiene usos, digamos, avanzados, con muy poco uno puede hacer algunas mejoras. Por ejemplo, el comando al ser ejecutado sin parámetros devuelve el tiempo que tardó el booteo de kernelandia y userlandia. En algo como: Startup finished in 3.481s (kernel) + 2min 43.545s (userspace) = 2min 47.027s Puede que esos números no significan nada para ustedes ahora, pero al ejecutarlo en varias máquinas de prestaciones similares pueden comenzar a entender su situación particular. Para individualizar el tiempo de boot por unidades y ordenado de mayor a menor pueden usar: systemd-analyze blame Cuya salida tiene el formato: [espacio] segundos [espacio] servicio . Es más o menos común que uno de los servicios que más tiempo consuman sea apt-daily.service . Pueden leer al respecto de la uti...

Comunicación efectiva con los niveles de ejecución, administración y operación

Esta entrada es un resumen libre de un video del escritor y desarrollador de Software Jono Bacon. La cuestión acerca de cómo lograr una comunicación efectiva con los distintos niveles jerárquicos de una organización suele ser un problema que aparece más temprano que tarde en nuestras carreras. Para comenzar a analizar esta situación, podríamos decir que existen básicamente 3 capas en una organización, no necesariamente en términos de importancia sino respecto al trabajo que realizan: La capa más alta es la ejecutiva, compuesta por CEOs, fundadores, vicepresidentes, etc. Aquellas personas que, se sabe, están efectivamente a cargo de la empresa.  La capa del medio suele estar integrada por los que se conocen como "mandos medios", los jefes de cada departamento en los que la empresa se divide para gestionar mejor al personal. Y, por último la capa inferior, que está compuesta por el personal de operaciones, quienés están haciendo los productos, vendiéndolos, etc. Se nec...

Refactorizando JS (presumiblemente) productivo

Uno suele cansarse de que gran parte del material relativo a Software que uno consiga en Internet esté dirigido a newbies. Sin embargo, hasta que los newbies no apliquemos el sabio principio RTFM , se hace necesario repetir lo mismo una y otra vez. Digo esto con conocimiento de causa: soy un grandísimo newbie. La diferencia es que nunca desprecio un consejo y siempre escucho a los que saben más que yo. Un par de aclaraciones antes de comenzar: El "presumiblemente productivo" del título pone en duda la "productividad" del código, no que esté o no disponible públicamente ya que de hecho lo está. Hay muchas más cuestiones que corregir del código, relacionadas con el estilo o uso de algunas mejoras traídas por las nuevas versiones de JS, pero todas estas cuestiones saldrían a la luz con el uso de un linter, así que la idea de estas entradas es que se enfoquen en cuestiones más conceptuales o relacionadas con el diseño. Comencemos: function msjInfo( bool...

Mejoras de la calidad del código escrito en Python

La automatización de la comprobación de la calidad del código es importante porque: Una máquina es más rápida y más precisa que un humano. Es fácil agregar nuevos checks. El código debe pasar las comprobaciones antes de ser mergeado. Mejora el ciclo de revisión acelerándolo y simplificándolo  Cualquier tarea de automatización requiere, por definición, uso de herramientas. En este caso hablaremos de flake8 , pylint y coverage flake8 Es básicamente un wrapper de pycodestyle , pyflakes y mccabe . Instalación pip install flake8 Uso flake8 my_module.py o flake8 my_package.py/ Componentes pycodestyle: verifica compatibilidad con pep8 y usos no idiomáticos. Por ej: Múltiples espacios antes de un operador  Ningún espacio alrededor de un operador Comparaciones con valores booleanos del tipo "if a == True"  pyflakes: no mira el estilo pero busca bugs y tiene una baja probabilidad de falsos positivos. Por ej: Paquetes importados y no usados. Variab...

Comenzando con AWK

Como decíamos en una entrada anterior , AWK es un lenguaje de programación expresivo y que resulta conveniente para ser usado en una amplia variedad de tareas de computación y manipulación de datos. Comenzando Prácticamente cualquier SO unix-like moderno viene con al menos una de las implementaciones de AWK instalada (awk, gawk , mawk , nawk , mks, awka , etc), por lo cual, si usamos uno de estos SOs no necesitamos instalar nada. Supongamos que tenemos un archivo llamado emp.data que contiene, un registro por línea, los sgtes. campos: Nombre del empleado Honorarios por hora en pesos Número de horas trabajadas Tendríamos una entrada de la sgte. forma: Beto         100    0 Daniel        75    0 Milagro    100    10 Marcos     125    20 Marías      130    22 Susana ...

El lenguaje de programación AWK

AWK es un lenguaje de programación que hace posible, con programas de una o dos líneas, la realización de tareas mecánicas de manipulación de datos cambiar de formatos, comprobar de validez de los archivos, encontrar items con ciertas propiedades, imprimir reportes, etc. AWK es un lenguaje muy versátil, se han usado programas AWK para: Bases de datos Diseño de circuitos Análisis numérico Compiladores Administración de sistemas AWK maneja texto con la facilidad que la mayoría de los lenguajes de programación manejan números. Un programa AWK es una secuencia de patrones y acciones que indican que patrón buscar en los datos de entrada y qué hacer cuando el patrón se encuentra. Un patrón puede seleccionar líneas por combinaciones de regex y operaciones de comparación de strings, números, campos, variables y elementos de arrays. Las acciones pueden realizar procesamiento arbitrario sobre las líneas seleccionadas. El lenguaje con el cuál se indican las acciones se parece a C, ...

PostgreSQL(1)

Esta es la primera entrada de una serie que es una especie de traducción/apunte/resumen que estoy haciendo del libro Seven Databases in Seven Weeks . RDBMS (Relational DataBase Management System) Cuando hablamos de sistemas de gestión de bases de datos relacionales hablamos de sistemas basados en teoría de conjuntos, implementados mediante tablas de dos dimensiones con filas de datos y columnas de un determinado tipo. A pesar del creciente interés en paradigmas y motores de bases de datos nuevos, el estilo relacional sigue siendo el más popular y probablemente lo sea durante algún tiempo. La prevalencia de las bases de datos relacionales puede deberse a: Sus toolkits: triggers, procedimientos almacenados, índices. Uso de transacciones seguras: mediante el cumplimiento con la regla ACID . Paradigma: muchos programadores hablan y piensan relacionalmente. Flexibilidad en las consultas. PostgreSQL PostgreSQL es un sistema open-source de gestión de bases de datos relacionales...

Cosas que tendrá Charly García cuando comience a quedarse solo

Los ojos muy lejos Un cigarrillo en la boca El pecho dentro de un hueco Una gata medio loca Un escenario vacío Un libro muerto de pena Un dibujo destruido La caridad ajena Un televisor inútil La radio a todo volumen Una prisión que no es suya Una vejez sin temores Una vida reposada Ventanas muy agitadas Una cama muy inmóvil Un montón de diarios apilados Una flor cuidando su pasado Un rumor de voces que le gritan Un millón de voces que le aplauden Y el fantasma suyo, sobre todo   Fuente

OWASP Vicnum Project

Vicnum es una colección de aplicaciones Web intencionalmente vulnerables. OWASP brinda este conjunto de aplicaciones Web que pretenden ser flexibles, realistas y quizá un poco divertidas con el fin de afilar las skills en seguridad y estimular el interés de estudiantes, gerentes, usuarios, desarrolladores y auditores. Las aplicaciones de Vicnum son usadas frecuentemente en ejercicios de CTF en conferencias de seguridad y suelen ejercitar problemas de seguridad comunes como el cross-scripting, las inyecciones sql y los problemas en el manejo de las sesiones. La idea es probar escáneres, técnicas de ataque, herramientas de análisis de código, firewalls y examinar la evidencia dejada por los ataques. Descargas De sourceforge pueden descargarse VMs vulnerables con algunas aplicaciones de Vicnum pero, dado que las aplicaciones son actualizadas individualmente, es mejor idea descargarlos por separado de sourceforge o github. http://vicnum.sourceforge.net/ https://github.com/frida...

2001: Experiencia internauta en el 3er mundo

El relato que constituye esta entrada puede parecer de naturaleza tercermundista y eso estaría muy bien porque de hecho lo es. Frecuentemente me pongo en el modo de lo que acá se llama "Viejo choto". Básicamente es un conjunto de pensamientos, emociones y acciones relacionados con una nostalgia muchas veces exagerada. En este último arranque nostálgico, me remonté a aprox. el año 2000. Vivía en un pueblo ubicado a orillas de una ruta nacional. En ese momento, mi pueblo natal, que tuvo como origen la explotación clandestina de yerba mate y té, rondaba los 70 años de su existencia y tenía menos de 10 mil habitantes. Yo tenía unos 7 años y leía unas revistas, que quizá conozcan, llamadas PC Users y PC Magazine. Existen hasta el día de hoy. Miraba, además, un programa de televisión sobre videojuegos llamado Nivel X. Tanto la revista como el programa de televisión hacían mención frecuente de una tecnología (probablemente en ese momento la habré llamado "cosa") llamada...

OWASP WebGoat

Hace 2 semanas salió la versión 8.0.0.M14 de OWASP WebGoat y está disponible en su repositorio oficial de GitHub. WebGoat es una aplicación intencionalmente insegura mantenida por OWASP, diseñada para enseñar demostrar las vulnerabilidades más comunes en aplicaciones Web dando soporte educacional para buenas prácticas de seguridad En cada lección, los usuarios deben demostrar su entendimiento de una issue de seguridad explotando una vulnerabilidad real en la aplicación de WebGoat. What's new? Para los que conocieron las versiones anteriores, esta última versión está más orientada a ser una plataforma de enseñanza que sólo de hacking. Ahora se explican las vulnerabilidades, se dan tareas para aprender como explotar la vulnerabilidad y se describen posibles escenarios de mitigación. Herramientas requeridas Apache Tomcat Proxies locales y WebSpiders recomendados por OWASP son: WebScarab (o ediciones más nuevas como OWASP Zed Attack ), BurpProxy y ParosProxy . Guía de...

OWASP Security Shepherd

OWASP Security Shepherd es una aplicación de entrenamiento en seguridad informática. Incluye más de 70 niveles que juntos abarcan un amplio espectro de tópicos Web y Mobile y es apto para gente que recién se inicia en seguridad ya que la dificultad de los niveles aumenta a un ritmo razonable. Este tipo de aplicaciones es fundamental para que aprendamos, mediante la práctica, a construir sistemas de Software más seguros sin comprometer a nadie en el camino. Las instrucciones respecto a como descargarlo, instalarlo y configurarlo se pueden encontrar en su repositorio GitHub. En este momento tengo una conexión a Internet con velocidad de descarga de 1KB/s así que, mientras descargo la VM con los ejercicios, les comento dos de los tópicos cubiertos por la aplicación y mejor explicados en el sitio oficial de OWASP Security Shepherd: Inyección SQL La inyección SQL, como cualquier tipo de flaw de inyección, ocurre cuando una aplicación puede enviar datos maliciosos a un determinado in...

JS: Triángulo de Pascal

Hoy, un pequeño problema de código Javascript. El siguiente snippet pretende crear un triángulo de Pascal . Al constructor Triangle se le pasa el número de filas que se quiere generar para la solución. La función fillRows() llama a fillRow(numRow) una vez por cada fila que se quiere generar. La función fillRow(numRow) se encarga de poner los números que van en cada posición de cada fila. Para ello usa un Array llamado row donde pone auxiliarmente los valores antes de agregarlos a this.rows . Estarán de acuerdo conmigo si les digo que el console.log() comentado como log "B" debería devolver lo mismo que el de la línea 5 -log "A"-. Pero no. Los resultados de cada console.log para new Triangle(2).rows son: Log "B": [[1], [1, 1]]. Log "A": [[1], undefined]. Es decir, this.rows tiene los valores correctos dentro de la función fillRow(numRow) pero no fuera de ella. ¿Cuál es el problema?¿Es una cuestión de scopes?¿Debería cambiar la...