"Telefónica Tech pone un fuerte énfasis en su estrategia de “todo en uno” y multinube híbrida, ya que busca aprovechar e integrar otras áreas de crecimiento como la Ciberseguridad y el IoT junto a la nube".
Robert Pritchard
Diciembre 2021
Script en Python para trabajar con shellcode bajo Windows.
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 shellcode, shellcode 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)