Esistono strumenti che si concentrano sull'analisi del codice shell?

4

Lo shellcode presenta alcune sfide per lo smontaggio. Spesso si auto-modifica, salta allo stack (dove verrà probabilmente inserito lo shellcode) e si basa su alcuni trucchi insoliti a cui gli strumenti di disassemblaggio standard non si focalizzano.

Tenendo presente questo, quali strumenti sono disponibili per il disassemblaggio e l'analisi dello shellcode?

    
posta Polynomial 21.08.2012 - 07:49
fonte

3 risposte

2

libemu . È libero. Per Linux, ma è in grado di analizzare lo shellcode win32.
miasm . Implementato in Python, sembra molto interessante.

    
risposta data 21.08.2012 - 08:03
fonte
3

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.

    
risposta data 21.08.2012 - 09:45
fonte
2

puoi usare scdbg con il file shellcode binario raw per ottenere un log di runtime di tutte le API che usa. L'esecuzione viene eseguita nell'ambiente di emulazione libemu. L'opzione -d creerà un dump della memoria una volta terminata se rileva eventuali modifiche alla memoria (auto decodifica). Lo strumento supporta anche l'individuazione degli offset iniziali di shellcode (in caso di prefisso ROP) e di una shell di debug integrata (di base). C'è un video di YouTube per vederlo in azione.

link

link

È possibile aprire la memoria riversata nel disassemblatore IDA che può essere interpretata come codice a 32 bit grezzo. Puoi inoltre impostare l'indirizzo di base (in genere non necessario) e modificare il codice se devi utilizzare funzionalità di scripting integrate.

    
risposta data 22.11.2012 - 13:20
fonte

Leggi altre domande sui tag