Since shellcode is just a raw block of instructions, these tools aren't really suited.
Wat? Gli eseguibili sono solo blocchi di istruzioni grezzi! No davvero. Ok, forse ci sono bit di dati in là per intestazioni PE / ELF o simili, o semplicemente dati di programma, ma i dati sono lo stesso binario delle istruzioni. Al punto le sezioni degli eseguibili sono etichettate (testo, dati) in modo che il sistema operativo sappia cosa trattare come cosa.
Per una demo, prendi qualsiasi set di assembler e digita:
nasm -f bin <asmfile.asm>
Non eseguirà assolutamente nessuna ulteriore barra di lavoro che traduca le istruzioni di assemblatore in opcode e lo scriva in un file binario. Ecco come procedere scrivendo un bootloader o qualcosa di simile.
Ora, se volessi analizzare alcuni shellcode, ci sono molti modi per farlo. Per i principianti, puoi semplicemente utilizzare un'imbracatura:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
int (*function)() = shellcode;
function();
}
e voilà sei fuori - semplicemente ottieni gdb o simili per un singolo passaggio. Certo, se volessi analizzare staticamente quel particolare frammento di codice shell, beh, c'è un modo anche per questo:
#include <stdio.h>
char shellcode[] = { ... };
int main()
{
FILE* f = fopen('test.bin', 'wb');
fwrite(shellcode, sizeof(shellcode), f);
fclose(f);
}
e ora hai un blob binario con cui lavorare. In realtà, è probabile che tu debba fare l'inverso di questo per caricare il codice nel cablaggio di prova (ad esempio, sfuggirlo) comunque.
Se stai cercando strumenti, ti suggerisco x86 wikibook . Fondamentalmente, si tratta di scegliere uno o più che ti puoi permettere e avere una recita.
A meno che lo shellcode contenga misure anti-debug (ricordate che è limitato allo spazio) è probabile che un debugger di runtime con il cablaggio di test funzioni perfettamente.