Identificar sockets en uso en 3.. 2.. 1..
Normalmente uso
# netstat -tnap
pero debo decir que
# lsof -i -P +c 0 +M
resulta sumamente útil también.
Visto en alias.sh
Normalmente uso
# netstat -tnap
pero debo decir que
# lsof -i -P +c 0 +M
resulta sumamente útil también.
Visto en alias.sh
En una charla de mate con un amigo dimos con las siguientes cuestiones, que pudimos dilucidar luego de pensar un buen rato (y sin salir a buscar en google o la wikipedia).
Dado el siguiente árbol y posterior listado de directorio:
. ├── bin ├── examples ├── pydasm │ └── build │ ├── lib.linux-x86_64-2.6 │ └── temp.linux-x86_64-2.6 └── rbdasm mauro@stereo:/usr/local/src/libdasm-1.5$ ls -la total 900 drwxr-xr-x 6 mauro mauro 4096 dic 15 2011 . drwxrwsr-x 5 root staff 4096 nov 29 12:04 .. drwxr-xr-x 2 mauro mauro 4096 ene 9 2006 bin drwxr-xr-x 2 mauro mauro 4096 dic 15 2011 examples -rw-r--r-- 1 mauro mauro 5558 dic 27 2007 HISTORY.txt -rw-r--r-- 1 mauro mauro 163894 dic 15 2011 libdasm.a -rw-r--r-- 1 mauro mauro 31201 feb 14 2006 libdasm.c -rw-r--r-- 1 mauro mauro 344 ene 9 2006 libdasm.def -rw-r--r-- 1 mauro mauro 17199 feb 21 2006 libdasm.h -rw-r--r-- 1 mauro mauro 162312 dic 15 2011 libdasm.o -rwxr-xr-x 1 mauro mauro 161338 dic 15 2011 libdasm.so -rw-r--r-- 1 mauro mauro 785 feb 21 2006 LIB.txt -rw-r--r-- 1 mauro mauro 605 ene 9 2006 Makefile -rw-r--r-- 1 mauro mauro 183 ene 9 2006 Makefile.msvc -rw-r--r-- 1 mauro mauro 283110 feb 21 2006 opcode_tables.h drwxr-xr-x 3 mauro mauro 4096 dic 15 2011 pydasm drwxr-xr-x 2 mauro mauro 4096 ene 11 2006 rbdasm -rw-r--r-- 1 mauro mauro 14460 feb 21 2006 README.txt -rw-r--r-- 1 mauro mauro 161 ene 9 2006 TODO.txt
Con el único fin de molestarles, acá van unas preguntas:
Se los dejo como tarea y en quince días vemos que sale…
Lamentablemente no pude estar en Capital para el recital que diera Pedro Aznar recordando al eterno flaco Luis Alberto Spinetta, me tuve que conformar con intentar verlo por algún medio de comunicación, y considerando que en casa no está andando la TV por cable, suelo recurrir a ver los especiales rockeros de TN por la web.
Pero a mi juicio los reproductores basados en Flash son un atropello al navegante cuando existen muy buenos reproductores de video; tiene que haber una forma de ver el flujo de video en tiempo real, pasando por fuera del navegador.
Afortunadamente el usuario LeaN946 en el foro de TDT Latinoamérica nos brinda la respuesta adecuada: utilizando rtmpdump con algunos parámetros mágicos:
$ rtmpdump -r rtmp://stream.tn.com.ar/live/tn2 \ -a live/tn2 -y tnlive3 \ -W http://tn.com.ar/sites/all/themes/dozer/swf/cplayer/player.swf \ -p http://tn.com.ar/envivo/especiales | cvlc -
o bien
$ rtmpdump -r rtmp://stream.tn.com.ar/live \ -a live -y tnhd1 \ -W http://tn.com.ar/sites/all/themes/dozer/swf/cplayer/player.swf \ -p http://tn.com.ar/envivo/24hs | cvlc -
es posible arribar a esto:
El audio deja un poco que desear 🙁 pero la imagen no está mal, no?
Como ya viene siendo una sana costumbre, el Grupo de Usuarios de Software Libre de la Universidad Nacional de Luján está organizando la edición local de la 8va edición del Festival Latinoamericano de Instalación de Software Libre (FLISoL), el evento simultáneo de difusión de Software Libre más grande en Latinoamérica.
El FLISOL se realiza desde el año 2005 y su principal objetivo es promover el uso del software libre, dando a conocer al público en general su filosofía, alcances, avances y desarrollo. Para tal fin, las diversas comunidades locales de software libre (en cada país, en cada ciudad/localidad), organizan simultáneamente eventos en los que se instala, de manera gratuita y totalmente legal, software libre en las computadoras que llevan los asistentes. Además, en forma paralela, se ofrecen charlas, ponencias y talleres, sobre temáticas locales, nacionales y latinoamericanas en torno al Software Libre, en toda su gama de expresiones: artística, académica, empresarial y social.
El FLISOL 2012 se llevará a cabo el sábado 28 de abril. Por quinta? sexta? séptima? vez, el UNLUX organizara la actividad en la ciudad de Luján. La jornada está dirigida a todo público, sin importar el nivel de conocimientos técnicos que se posea, y comprenderá la instalación de software libre en los equipos que acerque el público, así como también habrá charlas de variado tenor.
Agendando…
Más Info en el sitio web del UNLUX y en www.installfest.info/FLISOL2012/Argentina/Lujan
Recuerden que además, el sábado siguiente -5 de Mayo- tenemos ¡PyDay en la UNLu!
Finalizando las vacaciones, antes de reincorporarme al trabajo diario, dediqué unos días a seguir uno de los cursos de análisis de malware que tenía agendado desde hace tiempo, en este caso, el de Open Security Training.
La gente de OST provee el material, los ejemplos y los videos en línea para que uno vaya, a su tiempo, incorporando conocimientos repartidos en las siguientes clases:
Beginner Classes
Intermediate Classes
Advanced Classes
La primera clase sirve como base para las siguientes y discurre sobre los conceptos iniciales, describe el hardware sobre el que se programa en lenguaje ensamblador, describe con varios ejemplos las instrucciones del lenguaje más comunes, y muestra cómo seguir la ejecución de un programa con en Windows con Visual Studio Debugger (u OllyDbg, que no es tan distinto) y en GNU/Linux con gdb. Como bien hace mención el instructor, con conocer algunas pocas instrucciones ya es posible leer la mayoría de los programas.
La clase finaliza dejando como tarea el análisis y la resolución del clásico ejercicio de “bomba binaria” de la asignatura Arquitectura de Computadores de la Carnegie Mellon University, la cual requiere conocer técnicas básicas de ingeniería inversa para progresar a traves de las diferentes fases de la bomba, dando las respuestas correctas y evitando “explotarla”. Sin duda es un ejercicio que me ha entretenido mucho, me ha hecho pensar bastante, y que realmente debo recomendar como un buen inicio al arte de la ingeniería inversa.
Buscando información sobre el tema dí con el libro de cabecera de tal asignatura: Computer Systems: A Programmer’s Perspective, cuya edición 2011 es altamente recomendable. Está escrito en un lenguaje claro pero detallado, con ejemplos concretos (casi diría “palpables”) para explicar las abstracciones de sistema, y con un amplio conjunto de ejercicios para realizar. El sitio web contiene algunas secciones de ejemplo que sirven como preview, así como también material adicional al texto en papel. En retrospectiva, es el libro que me tendrían que haber recomendado cuando cursé las materias de arquitectura.
La clase “The Life of Binaries” trata efectivamente sobre “la vida de los ejecutables”, desde su creación: parsing del código fuente, abstract syntax trees, estrategias de compilación, lenguajes intermedios, enlazado del binario final; hasta su carga en memoria por el loader del sistema operativo y posterior ejecución en el computador. Se dan descripciones detalladas sobre los formatos binarios Portable Executable (PE) de Windows y Executable and Linkable Format (ELF) de Linux. El recorrido por el formato PE y su estructura, basado en el trabajo realizado por Ero Carrera, es muy completo y esclarecedor. La clase abarca también algunas de las técnicas que de ocultamiento y hooking utilizadas comúnmente en el malware, cómo funcionan realmente los virus de computadora, y qué técnicas es posible utilizar fácilmente para brindar mayor seguridad a los binarios que se generan.
A partir de esta clase se me ocurrió aprovechar el excelente trabajo realizado por Carrera con la biblioteca pefile y desarrollar con python-gtk2 un visor de archivos PE para interfaz gráfica, inspirado en el utilizado en los videos de entrenamiento. Dejo algunas capturas de la primera versión que no da vergüenza mostrar. El código, como siempre, se puede descargar desde el link que sigue y las correcciones y sugerencias serán bienvenidas.
Descargar: gpefile.py (v0.19, 78 KB)
Último cambio: Agregado despliegue de recursos RT_BITMAP, RT_GROUP_CURSOR, RT_GROUP_ICON, RT_STRING, GIF y PNG.
Me queda pendiente continuar con las clases siguientes, en cuanto el tiempo me lo permita. A la gente detrás del proyecto de Open Security Training, mi sincero agradecimiento por la dedicación y por el material brindado generosamente a la comunidad.
El Grupo de Usuarios de Software Libre de la Universidad Nacional de Luján (UNLUX) invita a toda la comunidad, profesionales e interesados en Tecnologías de la Información y la Computación al “Ciclo de charlas de Software Libre — CDC SoL” edición 2011.
Este es un evento gratuito, abierto, de interés general, orientado a toda la comunidad y destinado a la difusión y capacitación en el cual expertos en diferentes áreas hablaran sobre temáticas del Software Libre. Habrá charlas técnicas e informativas, cuyos principios fundamentales son el fomento y la difusión del software libre tanto en el uso de herramientas cotidianas, como también para el desarrollo de modelos de negocio sustentables.
El CDC SoL 2011 se llevará a cabo el día 19 de noviembre de 2011 de 10 hs. a 18 hs. en la sede central de la Universidad Nacional de Luján.
Para obtener más información o registrarse como asistentes pueden dirigirse al sitio oficial cdcsol.unlux.com.ar o bien al correo [email protected].
¡Esperamos contar con la participación de todos!
Esto surgió mientras un amigo depuraba un script de backup. Supongamos que creamos un script denominado ./myscript con el contenido siguiente:
echo parametro1 es $1 echo parametro2 es $2
Y luego lo ejecutamos alternativamente con los intérpretes Dash y Bash:
mauro@yoda$ dash $ . ./myscript parametro1 es parametro2 es $ . ./myscript foo bar parametro1 es parametro2 es
mauro@yoda$ bash $ . ./myscript parametro1 es parametro2 es $ . ./myscript foo bar parametro1 es foo parametro2 es bar
¿Se nota la diferencia?
Efectivamente, al utilizar el comando “.” (dot o source) Dash no pasa ningún argumento al script, mientras Bash sí lo hace. ¿Bug o Feature? Según parece, es una implementación estricta del estándar POSIX. En cualquier caso, hasta que nos dimos cuenta, fue un dolor de cabeza.
La semana pasada dediqué unos minutos a buscar algún software sencillo para rotar el fondo de pantalla aleatoriamente en GNOME, porque los que tengo ya me aburren, y se me ocurrió que ir rotándolos al inicio o cada cierto tiempo estaría piola. Lamentablemente no pude encontrar nada en Gnome que me permita indicar un directorio con imágenes y vaya cambiándolas cada tanto. Curiosamente XFCE sí lo tiene y si no me equivoco KDE también lo permite desde hace bastante.
El repositorio de Debian posee aplicaciones para cambiar el fondo de pantalla, pero no encontré ninguno que me satisfaga, sea porque no realiza rotación automática, porque no está disponible en la release estable, porque el método de funcionamiento es un tanto complejo para lo que hace, o bien porque requiere un montón de dependencias para funcionar (mono, anyone?).
Lo que pido es muy sencillo, dar una carpeta con archivos de imágenes, un tiempo de duración de cada fondo y listo, no más que eso; ni siquiera hace falta un diálogo de configuración. Como sé que, afortunadamente, los entornos de escritorio en Linux se llevan bien con la línea de comandos, no tardé mucho en encontrar la forma de cambiar el fondo de Gnome desde consola. Y de allí a cambiarlo automáticamente es un paso, por lo que terminé con un pequeño script en bash que denominé, en un alarde de creatividad, wallchanger, que no es sino una versión floreada de algo extremadamente sencillo:
#!/bin/sh while true; do CHOSEN=`find /usr/share/backgrounds -iname \*.jpg -print | shuf -n 1` gconftool-2 -s -t string /desktop/gnome/background/picture_filename $CHOSEN sleep 300 # 5 min done
La versión completa soporta además algunos parámetros útiles tales como cambiar la carpeta de imágenes, el tiempo de presentación de cada una, o el entorno de escritorio sobre el cual realizar el cambio:
Usage: wallchanger [-g|-x] [-f FOLDER] [-o MODE] [-w NN] -g set GNOME wallpaper -x set XFCE wallpaper -f FOLDER choose from wallpapers in FOLDER -o MODE set wallpaper mode [scaled|zoom|centered|...] -w NN change wallpaper every NN seconds
Como siempre, por si a alguno le es útil, dejo el enlace de descarga: wallchanger
Desde hace algunos meses me venía mordiendo un bug extraño en la máquina de trabajo donde a partir del kernel linux 2.6.39 e incluyendo la versión 3.0.0 el sistema se bloqueaba al inicio (el clásico freeze on boot) justo después del mensaje
Waiting for /dev to be fully populated
Y luego de eso, nada. Curioso, ya que con 2.6.38 el arranque iba de lo más normal, además que el equipo es un clon de los más comunes:
Procesador: Intel(R) Pentium(R) D CPU 2.80GHz Motherboard: Intel Corp. D102GGC2 VGA: ATI Technologies Inc RC410 [Radeon Xpress 200] Memoria: 1 GB
Obviamente a esa altura del arranque no hay muchos dispositivos disponibles, por lo que logs como para diagnóstico no tenía ninguno, así que por un tiempo desistí la investigación y me mantuve con el 2.6.38, ya que había que trabajar.
El primer sospechoso fue naturalmente udev, al fin y al cabo era el emisor del último mensaje que veía en pantalla. Diagnosticar problemas con udev es, digamos, un poco tedioso. Si leen el manual de udev encontrarán que en /etc/udev/udev.conf puede establecerse la variable udev_log en err, info o debug para definir la prioridad de los mensajes que serán mostrados en pantalla. Una vez hecho el cambio basta con reiniciar el equipo para ver los mensajes de información o diagnóstico correspondientes.Pero recientemente, aprovechando un día que llegué demasiado temprano, le dediqué unos minutos a este inconveniente que ya me tenía incómodo.
Desde ya es todo un pergamino de eventos el que va sucediendo en el arranque. Tantos eventos (y sin logging ni forma de recuperar los que ya pasaron) que me resultó imposible encontrar un patrón extraño o una pista siquiera de qué es lo que estaba sucediendo. Opté entonces por el clásico diagnóstico del pobre: conociendo dónde almacena udev las reglas (/lib/udev/rules.d/), fui desactivando las reglas y reiniciando el sistema tras cada cambio. Si el sistema continuaba el arranque luego del mensaje “Waiting for /dev …” entonces las reglas activadas eran inocentes; si no, alguna de las reglas activadas es la culpable. En algunos inicios no tenía gráfica, en otros no tenía disco, y en la mayoría ni siquiera teclado.
Una especie de búsqueda dicotómica me llevó, en pocos reinicios, a encontrar el archivo presuntamente culpable: 80-drivers.rules. Incluso llegué a determinar que la línea responsable era la séptima. Sin embargo el avance no fue mucho, ya que esta línea carga un montón de módulos en el kernel entre los cuales estan los de teclado y ratón: se ampliaba la lista de sospechosos.
Hasta acá, apenas si moví un paso, pero al menos llegaba a arrancar y controlar el sistema mediante SSH. Entonces un gran compañero de laburo (hat tip a Leandro), iluminado por el conocimiento (o quizá cansado de mis improperios) me recomendó: “¿y si probás cargando los módulos que faltan, uno a uno?”.
Entonces iniciamos el diagnóstico del pobre parte II. Haciendo un diff casero entre el lsmod del equipo iniciando con kernel 2.6.38 y uno iniciando con kernel 2.6.39 (sin 80-drivers.rules) llegamos a una lista de unos doce o quince módulos faltantes. Allí, tan cerca, login ssh y a probar cada uno de los módulos… pcspkr, evdev, psmouse, snd_hda_intel, todos cargaban bien… parport, fuse, ok… processor… chan! ahí se tildó todo.
AHA! El módulo processor! Pero ¿qué función cumple ese módulo? O mejor, ¿por qué sigue andando el sistema sin él?. Bueno, resulta que es el ACPI Processor Driver, que no es realmente necesario pero maneja cuestiones útiles tales como los estados de energía del procesador. Si lo recuerdan ACPI ya nos viene dando dolores de cabeza desde hace bastante.
Ya con esos datos, una búsqueda en Google reveló un dato fundamental, aunque se ve que no es nuevo: en ciertos equipos el sistema se cuelga a menos que uno cargue el módulo processor con el parámetro nocst=1.
Así que, de momento, agregué la línea
processor.nocst=1
a los parámetros de inicio del sistema y con eso estoy andando actualmente. ¿A qué se debe el bug? Ni idea, habría que hacer un bisect entre las versiones de kernel 2.6.38 y 2.6.39 para determinar cual es el commit jodido. En cualquier caso, queda como tarea para vacaciones…
Matthew Garrett es un biólogo (ahá) y reconocido hacker de Linux que lidia normalmente con complejas cuestiones de bajo nivel, pegadas al hardware, tales como ACPI, EFI, power management, y otras, que normalmente publica sus desventuras en el campo digital en un blog en livejournal. Muchos de sus artículos me han resultado realmente sorprendentes en cuanto a los intrincados detalles que pueblan los componentes de hardware desarrollados por diversos fabricantes.
Esta última semana publicó un artículo sobre el sencillo problema de cómo reiniciar correctamente una computadora. Me he tomado la libertad de traducir mejor dicho, interpretar ilegalmente, el post en cuestión. Para aquellos que se sientan cómodos con el inglés, les recomiendo el artículo original.
Reiniciando
Se podría pensar que es fácil reiniciar una PC, ¿no? Pero también podría pensarse que es fácil convencer a la gente de que al menos hacer un esfuerzo para ser amable con los demás es una propuesta de beneficio mutuo, y miren lo bien que nos ha funcionado.
Linux tiene un montón de maneras diferentes de reiniciar un sistema x86. Algunas de ellas son exclusivas para 32 bits y por eso las voy a ignorar porque, honestamente, que estás haciendo de tu vida [si estás trabajando en 32 bits]. Además, son horribles. Entonces, esto nos deja con cinco de ellas:
- kbd – reiniciar a través del controlador de teclado. La IBM PC original tenía la línea [el cable] de reinicio de la CPU asociada a la controladora del teclado. Escribiendo la apropiada cantidad mágica de pulsos en la línea y la máquina se reinicia. Todo esto es muy sencillo, salvo por el hecho de que las máquinas modernas no tienen controladores de teclado (en realidad son parte del controlador embebido) e incluso las máquinas más modernas ni siquiera pretenden tener un controlador de teclado. Ahora, los controladores embebidos ejecutan software. Y, como todos sabemos, el software es terrible. Pero, aún peor, el software del controlador embebido está escrito por autores de BIOS. Así que claramente cualquier pretensión de que esto funcione es una especie de ficción complicada. Algunas máquinas son muy exigentes con el hardware, exigiendo que esté en el estado exacto que Windows lo programaría. Algunas máquinas funcionan 9 de cada 10 veces y luego se bloquean debido a algún raro problema de temporización. Y otras simplemente no funcionan en absoluto. ¡Hurra!
- triple – intentar generar una falla triple. Esto se realiza cargando una tabla vacía como vector de interrupciones, y luego llamando a int(3). Falla la interrupción (no hay IDT), falla el manejador de fallos (no hay IDT) y la CPU entra en un estado que debería, en teoría, desencadenar un reinicio. Salvo que no parece haber un requerimiento de que esto suceda, y esto simplemente no funciona en un montón de máquinas.
- pci – en realidad no pci. Tradicionalmente, el acceso al espacio de configuración PCI se logra escribiendo un valor de 32 bits al puerto io 0xcf8 para identificar el bus, el dispositivo, la función y el registro de configuración. El puerto 0xcfc luego contiene el [valor del] registro en cuestión. Pero si se escribe el par apropiado de valores mágicos en 0xcf9, la máquina se reiniciará. Espectacular! Y no estandarizado de ninguna manera (ciertamente no es parte de la especificación PCI), por lo que chipsets diferentes pueden tener diferentes requisitos. Booo.
- efi – Los servicios EFI en tiempo de ejecución proporcionan un punto de entrada para reiniciar la máquina. Incluso a veces funciona! Siempre y cuando los servicios de tiempo de ejecución EFI estén funcionando, lo que puede ser una exageración.
- acpi – Las versiones recientes de la especificación ACPI permiten especificar una dirección (por lo general en espacio de memoria o E/S de sistema) y un valor a escribir ahí. La idea es que escribir el valor a la dirección reinicia el sistema. Resulta que eso, a menudo, falla. También es imposible representar el método de reinicio PCI a través de ACPI, porque el método de reinicio PCI requiere un par de valores y ACPI sólo da uno.
Ahora, debo admitir que esto suena bastante deprimente. Pero la gente claramente vende computadoras con la expectativa de que van a reiniciarse correctamente, entonces ¿qué es lo que pasa?
Hace un tiempo hice algunas pruebas con Windows corriendo sobre qemu. Esta es una buena manera de evaluar el comportamiento del sistema operativo, porque uno tiene el control completo de lo que se entrega al sistema operativo y lo que el sistema operativo trata de hacer con el hardware. Y lo que descubrí fue un poco sorprendente. En ausencia de un vector de reinicio ACPI, Windows utiliza el controlador del teclado, espera un momento, lo intenta de nuevo y luego abandona. Si existe un vector de reinicio ACPI, Windows lo utiliza, luego prueba con el controlador del teclado, luego vuelve a utilizar el vector ACPI y prueba el controlador del teclado una vez más.
Esto resulta ser importante. Lo primero que significa es que genera dos escrituras en el vector ACPI de reinicio el sistema. El segundo es que deja un espacio entre ellas mientras toquetea el controlador de teclado. Y, sorprendentemente, resulta que en la mayoría de los sistemas el vector de reinicio ACPI apunta a 0xcf9 en el espacio de E/S del sistema. Incluso cuando la mayoría de las implementaciones nominalmente requieren escribir dos valores distintos, parece que este no es un requisito estricto y el método ACPI funciona.
[La versión del kernel Linux] 3.0 incluirá este comportamiento por defecto. Hace que varias máquinas funcionen (algunas Apple, por ejemplo), mejora las cosas en otras (algunas Thinkpad parecen quedarse tiesas durante largos períodos de tiempo, de otra manera) y con un poco de suerte evitará la necesidad de añadir más peculiaridades específicos al código de reinicio. Todavía hay algunas divergencias entre nosotros y Windows (mayormente en cuán seguido escribimos en el controlador de teclado), que se puede limpiar si resulta que hace alguna diferencia en cualquier lugar.
Ahora. De vuelta a los bugs de EFI.
– mjg59
Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress