Parchear archivo binario de dwm con xxd y HT Editor

Este artículo intenta enumerar algunas herramientas que pueden ser de interés o utilidad para algunos usuarios. dwm es el gestor de ventanas que utilicé para experimentar basado solamente en mi experiencia particular. En casos como este lo correcto es compilar el código fuente.

Recientemente me propuse cambiar Bspwm por dwm. No hay ninguna razón en particular, Bspwm es un excelente gestor de ventanas, no hay nada malo en él, simplemente quería probar dwm. Desde hace tiempo vengo siguiendo los proyectos de suckless.org. Su filosofía principal: «mantener las cosas simples, mínimas y utilizables». También tienen otros proyectos interesantes como: st, dmenu, surf etc.

Por lo tanto queda en el usuario mantener el control absoluto de lo que realmente desea tan solo modificando un archivo de configuración destinado a tal fin, y luego compilando dicha herramienta obtendrás los resultados deseados. Si bien es una característica típica del proyecto suckless.org también es posible modificar cualquier código fuente, aunque a veces los métodos pueden diferir.

Mi primera intención fue compilar la última versión de desarrollo (dwm), sin embargo no tuve éxito debido a conflictos de dependencias. Debian después de un tiempo prolongado empieza a quedarse desfasado en muchas librerías, por otro lado instalar una versión de desarrollo en una distribución estable no tiene mucho sentido. Debian es estabilidad -eso lo sabemos todos-.

Convencido de utilizar dwm procedí a instalarlo desde los repositorios de la distro, y todo estaba bien hasta que abrí la terminal. Mayormente en mis gestores de ventanas solía utilizar urxvt pero últimamente la terminal que utilizo es st. En el caso de Debian 9 la terminal predeterminada de dwm es x-terminal-emulator es decir: Terminator, de hecho es una dependencia obligada al instalar dwm.

Y en dwm no es tan sencillo como editar un archivo de configuración y elegir la terminal que deseamos como es el caso de bspwm o i3wm. dwm se configura antes de compilarlo. Como ya había descargado la versión compilada de la distro ejecutando: sudo apt install dwm decidí parchear el binario. Simplemente era una pequeña prueba para ver si se podría utilizar st u otro terminal sin compilar el código fuente.

Para realizar esta tarea utilicé dos herramientas indistintamente:

  • xxd
  • HT Editor

La herramienta xxd

Cuando miro películas donde la informática es en gran parte el foco de la acción intento ver que sistema y herramientas se utilizan – mera curiosidad –. Sin duda a esta herramienta la descubrí en la película «Blackhat» o «Hacker: amenaza en la red» para Hispanoamérica. El protagonista Nicholas Hathaway (Chris Hemsworth) en cuestión de segundos despliega código hexadecimal en su terminal utilizando xxd.

Sobre xxd:

Crea un volcado hexadecimal de un archivo dado o entrada estándar. También puede convertir un volcado hexadecimal de nuevo a su forma binaria original. Al igual que uuencode y uudecode, permite la transmisión de datos binarios en una representación ASCII «segura para el correo», pero tiene la ventaja de decodificar a la salida estándar. Por otra parte, se puede utilizar para realizar parches de archivos binarios.

Al parecer no se trata de una simple herramienta, realiza cosas interesantes y prácticamente no requiere de espacio en disco. Es una utilidad de volcado utilizada por Vim, probablemente ya esté en tu sistema si lo tienes instalado. Más adelante veremos las utilidades de xdd. Para saber más ejecuta man xxd en tu terminal.

Parcheando el archivo binario dwm

El primer paso fue crear una copia del archivo binario, la idea es manipular un archivo de prueba no el original:

cd /usr/bin/

sudo cp dwm dwm.test

seguidamente ejecuté xxd con la opción -c32 para designar el número de columnas por linea (por defecto es 16), esto me permite aumentar los caracteres en la columna ascii, además utilicé la tubería con el comando less para desplazarme en el volcado hexadecimal sin salir de él. Para buscar cadenas de texto utilizo la barra invertida ‘/’ al igual que en Vim:

xxd -c 32 dwm.test | less

El texto a buscar evidentemente es x-terminal-emulator, sin embargo a veces la cadena de bytes puede estar cortada por lo que lo simplifiqué a x-term a ver si arrojaba algún dato y efectivamente ahí estaba mi terminal que obviamente no deseaba.

Una vez que obtuve la información el siguiente paso fue parchear esa cadena por mi terminal favorita. Para un mismo caso utilicé 3 métodos distintos: xxd, vim + xxd y HT Editor.

Usando xxd

En Debian la terminal st figura como: stterm, y es la que usaré para ejemplificar.

De acuerdo a la imagen anterior en la linea 4c49 454e 545f 4c49 5354 0078 2d74 6572 6d69 6e61 6c2d 656d 756c 6174 6f72 de la columna hexadecimal se puede ver que la cadena de texto «x-terminal-emulator» comienza en el offset 998b con el valor 78(x), y culmina en 72(r). En total son 19 bytes.

¿Cómo calculé el offset 998b?

La dirección 00009980 a la izquierda del volcado hexadecimal indica donde comienza el primer byte de esa linea, en este caso representa a 4c. Si seguimos contando 9981(49) 9982(45) 9983(4e) 9984(54) 9985(5f) 9986(4c) 9987(49) 9988(53) 9989(54) 998a(00) finalmente 998b(78) el valor de x. Recordemos que estamos trabajando con números hexadecimales que son representados del 0-9, A-F (16), por eso después de 9989 no continúa 9990 sino 998a.

Una vez que supe la dirección donde debo comenzar el parcheo solo me queda resolver los valores hexadecimales de la cadena stterm. Con el comando xxd - se abre un interprete interactivo, luego de escribir el texto cerramos con Ctrl+D y nos arroja los valores hexadecimales.

Ahora llegó el momento de parchear ejecutando en un terminal con permisos de superusuario:

El comando xxd -r realiza una operación inversa: convierte (o parchea) el volcado hexadecimal (hexdump) en binario, incorporando los cambios que hayamos hecho. En vim + xxd se ve con más claridad este apartado.
echo "0000998b: 7374 7465 726d 00" | xxd -r - dwm.test

La primer numeración corresponde a la dirección dónde empezará mi parcheo seguido de dos puntos (:), luego los valores hex. de stterm calculados anteriormente, el byte 0a se descarta ya que equivale al punto (.), finalmente se imprime un null (00), si solo un null, cuando coloco ’00’ en la columna hexadecimal al finalizar la cadena stterm u otra, el programa leerá esa instrucción hasta que llegue el null y el resto de la cadena la ignora continuando con las siguientes instrucciones. No importa que queden restos de x-terminal-emulator.

Sin embargo me gusta que el código quede lo más limpio posible. De la siguiente manera me aseguré de que solo estuviera la cadena stterm:

echo "0000998b: 7374 7465 726d 0000 0000 0000 0000 0000 0000 00" | xxd -c19 -r - dwm.test

Los ceros como dije anteriormente insertan null. La opción -c19 es para parchear los 19 caracteres, puedo usar -c24, -c32… en lugar de 19, lo importante es que sean al menos la cantidad de bytes a parchear. xxd por defecto permite colocar hasta 16 octetos (el número de columnas predeterminado) y el total de caracteres ascii eran 19 (x-terminal-emulator), por lo tanto me quedarían 3 octetos sin parchear.

Parcheado con la cadena stterm solamente:

Si no hubiera especificado -c19 el parcheo quedaría incompleto, de la siguiente forma:

podría resolverlo así – aunque es un paso realmente innecesario –:

echo "0000999b: 0000 00" | xxd -r - dwm.test

El offset 999b es donde comienza la cadena que me quedaría sin parchear (t)or. Eso es todo, solo quería exponer las «situaciones posibles».

Vim + xxd

Este método parece ser más sencillo, aunque el anterior no es tan difícil. Al abrir el archivo binario con el comando: vim -b dwm.test me encontré con mucha basura, símbolos y caracteres desordenados por doquier. Con la utilidad xxd de Vim se puede abrir un buffer con un hexdump del archivo binario y podemos editarlo o parchearlo.

para generar el volcado hexadecimal escribimos en modo comando :%!xxd y nos abrirá el buffer correspondiente.

finalmente solo tuve que sustituir los valores hexadecimales de x-terminal-emulator por la cadena 7374 7465 726d 0000 0000 0000 0000 0000 0000 00 que obtuve anteriormente. Una vez que realicé los cambios volví al modo comando y escribí :%!xxd -r para revertir el volcado hexadecimal (hexdump) a binario nuevamente, xxd -r incorpora todos los cambios que hayamos hecho en la columna hexadecimal. Para finalizar guardé los cambios y salí del editor con :wq!

Si apreciaron la imagen se puede ver que los caracteres en la columna ascii no cambiaron al modificar los bytes hexadecimales, eso es debido a que xxd -r ignora totalmente esa columna. De hecho podemos modificarla a antojo que no sufrirá efecto alguno cuando ejecutemos el comando de revertir.

La herramienta HT Editor

De acuerdo al sitio oficial:

Es un visor de archivos, editor y analizador de archivos de texto, binarios y (especialmente) archivos ejecutables; en otras palabras, es un editor y desensamblador avanzado.

Esta es sin duda una herramienta más intuitiva y muy completa, está basada en ncurses y no requiere de muchos recursos. Para saber más sobre HT ejecutas en un terminal: hte -h o man hte. El primero te abrirá el mismo editor, desplázate a la sección Features.

Aunque para mi propósito podría haberlo hecho con otra herramienta mucho más sencilla como por ejemplo: Midnight Commander (imagen de cabecera), no obstante siempre es bueno saber que en GNU/Linux contamos con un gran abanico de posibilidades para poder experimentar. Con HT solo me limité a sustituir los caracteres en la columna ascii, nada de conversiones.

HT se ejecuta desde la terminal con el comando: hte, luego están las teclas Alt+f para abrir el explorador de archivos. También se puede invocar directamente el archivo ejecutando hte -b nombreArchivo. Si no estamos en el mismo directorio se especifica la ruta del archivo.

Manejarse en HT es relativamente sencillo, como en cualquier editor ncurses: mc, nano…, contamos con un panel inferior con las opciones para cada caso. Al abrir el archivo dwm.test presioné F7 (buscar), en este caso texto en ascii:

una vez encontrada la cadena solo me quedó presionar F4 (editar) y aquí se nos abren dos posibilidades: editar el código en la columna hexadecimal o usar la tecla Tabular para intercambiar a la columna ascii. Obviamente elegí la 2da. opción, seguidamente escribí stterm y luego volví a la columna hexadecimal para imprimir los null (00), aunque como mencioné anteriormente con un solo null está resuelto.

Finalmente presioné F2 para salvar los cambios y F10 para salir.

Conclusiones

Esto no es muy común de hacer, solamente estaba experimentando. Debian en ese sentido facilitó las cosas, si en lugar de x-terminal-emulator figurara xterm no hubiera podido parchear con stterm exitosamente, o tal vez si. Es probable que el binario funcionase igual, sin embargo también es posible que haya un desbordamiento de la pila y eso ya es una vulnerabilidad en el programa.


Fuente:
http://www.tutorialspoint.com/unix_commands/xxd.htm
http://hte.sourceforge.net/

¿Te resultó interesante? Compártelo ...



Percaff_TI99

Publicado por Percaff_TI99

http://gutl.jovenclub.cu/ » Forma parte de GUTL desde el 10 agosto, 2013. Amante de la ciencia y tecnología en general. Usuario de GNU/Linux desde hace varios años.

Este artículo tiene 7 comentarios

  1. Amigo, me ha dado la impresión por algunos de tus artículos que eres fan de las herramientas ligeras, sucede que hace rato estoy por migrar mi laptop buscando mejor rendimiento pero como trabajo en ella no puedo estar en el prueba y error que sería aventurarme a instalar los ambientes ligeros que por ahi se dan propaganda. ¿No puedes elaborar algún artículo describiendo más menos en detalle el hardware y software que usas hoy? Gracias.

    • Hola @Rolando Pérez Rebollo:

      En realidad utilizo entornos que no son de los más livianos, Debian 9 con el escritorio MATE y KDE Neon con PLASMA. En el caso de bspwm o dwm los utilizo cuando voy a usar varias terminales y otras herramientas, simplemente me paso a otra tty o inicio una nueva sesión. Casos puntuales.

      En cuanto a las herramientas muchas podrían decirse que escapan fuertemente del minimalismo: eclipse, atom, netbeans, blender, aegisub, IntelliJ IDEA etc.

      Ahora cuando veo una herramienta liviana que se desempeña bien la uso, no se si tanto por los recursos del sistema, sino que lo que me ofrece dicha herramientas me alcanza. Además muchas de ellas se integran bien en un gestor de ventanas donde se usa mayormente el teclado. Por otro lado hago hincapié en lo simple y liviano porque mucho de los cubanos además de recursos limitados, tienen dificultades para descargar los paquetes.

      Ahora en el tema del escritorio depende de cada usuario, yo no te sugeriría un escritorio minimalista extremo. Aquí en el portal hay varios artículos sobre escritorios livianos. Mayormente utilizo una lapto de 2GB de RAM, y tiene un comportamiento aceptable a menos que utilice varias aplicaciones bastantes pesadas al mismo tiempo. Un escritorio Xfce4 es una buena opción, otros te dirán MATE, lxqt, en fin depende más de las herramientas que uses en tu sistema que en el mio.

      Saludos.

    • Te recomiendo wmaker, es bonito y ligero a dia de hoy tengo un pc que uso como servidor con debian 9 instalado en un P3 con 256M y micro coppermine a 1GHz Intel, els board es Aopen, para i es el mas ligero de todos y tiene varios complementos. Te vas a acordar de los viejos tiempos donde con pocas cosas se lograba mucho, tambien he probado en este p3 icewm y fwmcrystal pero de todos wmaker es el ‘as ligero para mi. Soporta temas, etc.

      • WindowMaker me retrotrae a los tiempos de NeXTSTEP, lo probé de puro nostálgico que soy, y me resultó un poco tosco. Pera la rapidez de este gestor es innegable, además se sigue manteniendo -eso es lo importante-. En cuanto a icewm aquí en GUTL hay varios artículos escritos por @Delio, puede ser un punto de partida también. PeKWM es otro de bajo peso.

        Que pasó con openbox, fluxbox, parece haberse perdido el insterés en ellos. Cuando miro video tutoriales poco veo de ellos.

  2. En debian el x-terminal-emulator generalmente es un script que pertenece al estandar xdg por ejemplo existe ambien x-default-browser o algo parecido que dentro definen los programas por defecto que se abriran en cada caso en tu caso creo que con solo hacer un enlace simbolico de tu terminal a x-terminal-emulator seria suficiente. De seguro se instalo terminator a parte por dependencia. Puedes instalar los programas sin su recomendacion prueba instalar con

    aptitude install -R dwm

    de esta forma tendras los programas y el sistema lo mas ligero posibles

Los comentarios están cerrados.