Bombas Zip II: Bombas quine

En el post de la semana pasada introduje las bombas zip y expliqué como crear una bomba zip mediante la técnica de recursión. Te recomiendo que le eches un vistazo si todavía no lo has hecho. 

En esta nueva entrada voy a introducir las Bombas Quine. 

Programas Quine

En informática, un programa “quine” es un programa que se replica a sí mismo. Es decir, un programa cuyo código fuente genera como output el propio código fuente. Esto no es sencillo de conseguir. Veamos un ejemplo.

Si en python ejecutamos print(1) , el output sería 1. Necesitamos que el output sea el mismo que el input, en este caso print(1). Si introducimos como input print(“print(1)”), entonces obtendríamos print(1) como output. Pero el input ha cambiado, por lo que seguimos sin conseguir que se replique.

Tras darle varias vueltas, al final se puede hacer jugando con la recursión:

Explicación rápida: creo una variable llamada lethani, que contiene el texto “print(‘lethani = ‘, repr(lethani)); print(lethani)”. A continuación imprimo el texto ‘lethani  = ‘ y la variable lethani entre comillas (esto lo hace la función repr). Por último, imprimo la variable lethani.

Pero más allá de ser algo entretenido, en prinicipio no tiene mucha utilidad en el hacking. ¿O sí?

 

Zips Quine

Imagina que basándonos en esta lógica, conseguimos un zip que al descomprimirlo generase ese mismo zip. Esto es una bomba zip quine. Si se realizase una descompresión recursiva, el sistema descomprimiría el zip, y al encontrar un nuevo zip intentaría descomprimirlo, pero este generaría un nuevo zip que de nuevo intentaría descomprimir… Así en un bucle infinito en el que el sistema nunca terminaría de descomprimir.

Para plantearse hacer esto hay que entender cómo funciona la descompresión de zip, que está basada en la descompresión LZ77. En este tipo de descompresión se utilizan dos comandos:

  • print M: imprime las siguientes M lineas del input. Esas líneas no se ejecutarán.
  • repeat M N: repite las últimas M lineas del output, empezando desde la N-ésima línea del final.

Es un poco enrevesado de entender al principio, aqui tienes dos ejemplos explicados de cómo funciona:

La izquierda es el input, la derecha el output. print 2 hace que las siguientes dos líneas, print 3 y print 4 se impriman en el output. Estas lineas no se ejecutan, asi que pasamos a repeat 1 1, que imprime en el output una línea empezando por la última línea del output, print 4.

En este segundo caso, print 0 imprime 0 lineas (es equivalente a la instrucción NOP), a continuación con print 2 se imprimen las siguientes dos líneas, print 1 y print 2, y por último se hace un repeat 3 2, por lo que se imprimen 3 líneas empezando por la penúltima del output. En ese momento en el output solo está el print 1 y el print 2, por lo que empezaría imprimiendo el print 1 (la penúltima del output), y como es también la primera línea de código del output y ya no hay más por encima, se pasa a imprimir la última línea del output, con lo que a continuación imprime el print 2, y de nuevo el print 1.

Si conseguimos realizar un programa quine utilizando estos dos comandos, entonces podrémos realizar un zip quine. Para probarlo, yo he encontrado esta página web, con una shell interactiva. Te recomiendo que la visites e intentes realizar el programa quine tú mismo. Yo tras estar un rato lo conseguí de esta forma:

Es posible realizar un programa quine con estas instrucciones. Por tanto, es posible realizar un zip quine. Sin embargo traducir de este pseudolenguaje al que utiliza Zip no es una tarea sencilla, y requiere de un alto nivel de programación. Si quieres más información sobre ello, puedes consultar este post de Russ Cox, y mirar este código fuente en Go que genera el zip quine.

Finalmente,  de aquí te puedes descargar una copia de un zip que al descomprimirse se genera a sí mismo.

No obstante, estos dos métodos de bombas zip que hemos visto son en realidad bien conocidos por antivirus y sistemas operativos, puesto que se descubrieron hace muchos años. Por ello, hoy en día los programas no descomprimen automáticamente de manera recursiva las carpetas, sino que descomprimen hasta cierto límite de profundidad que se le indica en la configuración. Lo mismo ocurre con los antivirus. Por ello, estos métodos son poco efectivos si el scope del ataque son usuarios normales que lo van a descomprimir con programas de descompresión winRAR o 7zip.

Sin embargo, recientemente  David Fifield ha lanzado una nueva forma de realizar una bomba zip nunca antes vista mediante solapamiento de ficheros, que analizaré la semana que viene en la tercera y última entrada de bombas zip.

Lethani.

Esta entrada tiene 2 comentarios

Deja una respuesta