Dado que Shellcode es solo un bloque de instrucciones en bruto, estas herramientas no son realmente adecuadas.
Wat? ¡Los ejecutables son solo bloques de instrucciones en bruto también! No realmente. Bien, tal vez haya bits de datos allí para los encabezados de PE / ELF o similares, o simplemente datos de programas simples, pero los datos son el mismo binario que las instrucciones. Hasta el punto, las secciones de los ejecutables están etiquetadas (texto, datos) para que el sistema operativo sepa qué tratar como qué.
Para una demostración, tome cualquier conjunto de ensamblador y escriba:
nasm -f bin <asmfile.asm>
Eso no hará absolutamente ninguna barra de trabajo adicional al traducir las instrucciones del ensamblador a opcodes y escribirlas en un archivo binario. Así es como escribirías un gestor de arranque o similar.
Ahora, si desea analizar un código de shell, hay muchas formas de hacerlo. Para empezar, puedes usar un arnés:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
int (*function)() = shellcode;
function();
}
y listo está, simplemente obtenga gdb o algo similar a un solo paso. Por supuesto, si desea analizar esa parte particular del código de shell de forma estática, también hay una forma de hacerlo:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
FILE* f = fopen('test.bin', 'wb');
fwrite(shellcode, sizeof(shellcode), f);
fclose(f);
}
y ahora tienes un blob binario para trabajar. En realidad, es probable que tuvieras que hacer lo contrario para cargar el código en el arnés de prueba (es decir, escapar de él) de todos modos.
Si estás buscando herramientas, sugiero los x86 wikibook . Básicamente, se trata de elegir uno o más que puedas pagar y tener una jugada.
A menos que el código de shell contenga medidas anti-depuración (recuerde, tiene espacio limitado) es probable que un depurador en tiempo de ejecución con el arnés de prueba funcione bien.