PyShell2Bin


12/09/13. Versión 0.1


Pyshell2Bin

Cualquiera que trabaje con exploits y shellcode, ya sabrá lo que son y cómo prepararlos. A veces los exploits vienen en C, Perl, Python… y son algo así:

payload = (b"xbfxabxd0x9ax5bxdaxc7xd9x74x24xf4x5ax2bxc9" + "xb1x45x83xc2x04x31x7ax11x03x7ax11xe2x5ex2c" + "x72xd2xa0xcdx83x85x29x28xb2x97x4dx38xe7x27" + ...

Pero a veces se necesita una representación en fichero binario de ese shellcode para poder inyectarlo en un fichero, depurarlo o por cualquier razón. Existen toda clase de scripts ahí fuera para trabajar con shellcode y realizar diferentes tareas. Binario a shellcodeshellcode a binario (solo para bash)… Pero no hemos sido capaces de encontrar un script simple para conseguirlo bajo Windows. Incluso encontrar el comando “xxd” (realizar un volcado hexadecimal) portado a Windows es posible pero no sencillo (parece que viene con Vim para Windows, y que antes estaba disponible junto a las unixtools…)

En cualquier caso, este es un script simple en Python que funciona en Windows y hará el trabajo. Tolera shellcode sucio (con espacios, retornos de carro, comandos de concatenación…) y solo se quedará con los caracteres hexadecimales. Después utiliza un “write” con “wb” para obtener un fichero binario. Quick and dirty.

Aquí está el pequeño código. Se puede copiar y pegar simplemente en un fichero .py. Comprobado en la rama 2.7.

import binascii
import fileinput
import os
import re
import sys

def shell2bin(args):
 if len(args) < 2:
  print "Usage: %s shellcodefile binfile" % args[0]
  return
 else:
  try:
   with open(sys.argv[1], "r") as fileshell:
    flux = fileshell.read()
    flux = re.sub("[^0-9,^a-f,^A-F]", "",flux)
   with open(sys.argv[2], "wb") as filebin:
    filebin.write(binascii.unhexlify(flux))
    print "Done!"
  except IOError as e:
   print "I/O error({0}): {1}".format(e.errno, e.strerror)
  except:
   print "Unexpected error:", sys.exc_info()[0] 
if __name__=='__main__':
 shell2bin(sys.argv)