WABT (pronunciato “wabbit”) è il WebAssembly Binary Toolkit di riferimento — una suite di strumenti da riga di comando per lavorare con wasm a basso livello. Converte tra il formato binario .wasm e il formato testo leggibile dall”uomo .wat, disassembla e scarica i moduli, li convalida, produce una decompilazione simile al C e interpreta/esegue wasm. È la cassetta degli attrezzi fondamentale sia per lo sviluppo wasm che per il reverse engineering.
Installazione
| Piattaforma | Comando |
|---|
| macOS (Homebrew) | brew install wabt |
| Debian/Ubuntu | sudo apt install wabt |
| Arch Linux | sudo pacman -S wabt |
| npm | npm install -g wabt |
| Dal sorgente | compila con CMake dal repository WebAssembly/wabt |
| Verifica | wat2wasm --version |
Gli Strumenti Principali
| Strumento | Converte / fa |
|---|
wat2wasm | Testo .wat → binario .wasm |
wasm2wat | Binario .wasm → testo .wat (disassembla) |
wasm-objdump | Scarica sezioni, opcodes, simboli |
wasm-decompile | Produce pseudocodice leggibile simile al C |
wasm-validate | Convalida un modulo |
wasm-interp | Interpreta/esegue un modulo (stack machine) |
wasm2c | Converte wasm → codice sorgente C |
wasm-strip | Rimuove sezioni (ad es. nomi) da un modulo |
Testo ↔ Binario
# Assembla testo in binario
wat2wasm module.wat -o module.wasm
# Disassembla binario in testo (il punto di partenza del RE)
wasm2wat module.wasm -o module.wat
# Mantieni i nomi di debug / sezioni personalizzate durante il disassembly
wasm2wat --generate-names module.wasm
| Opzione | Effetto |
|---|
-o FILE | File di output |
--generate-names | Sintetizza nomi per funzioni/locali senza nome |
--enable-FEATURE | Accendi una proposta wasm (ad es. --enable-threads) |
-v | Verboso |
Ispezionare un Modulo (objdump)
# Dump completo di sezione + disassembly
wasm-objdump -x module.wasm # intestazioni/sezioni
wasm-objdump -d module.wasm # disassembla codice
wasm-objdump -s module.wasm # contenuti sezione (hex)
| Flag | Mostra |
|---|
-h | Intestazioni di sezione |
-x | Dettagli di tutte le sezioni |
-d | Corpi della funzione disassemblati |
-s | Contenuti della sezione grezza |
-j SECTION | Limita a una sezione |
Decompilazione (Output Leggibile)
# Decompilazione simile al C — molto più facile da leggere di WAT
wasm-decompile module.wasm -o module.dcmp
wasm-decompile ricostruisce il flusso di controllo strutturato e locali tipizzati, rendendo un modo veloce per comprendere cosa fa un modulo durante il triage.
Convalida e Esecuzione
| Comando | Scopo |
|---|
wasm-validate module.wasm | Conferma che il modulo è ben formato |
wasm-interp module.wasm --run-all-exports | Esegui le funzioni esportate |
wasm2c module.wasm -o module.c | Emetti C per la compilazione/analisi |
Flusso di Lavoro di Reverse-Engineering
# 1) Disassembla con nomi
wasm2wat --generate-names target.wasm -o target.wat
# 2) Scarica importazioni/esportazioni per comprendere le capacità
wasm-objdump -x target.wasm | grep -E "import|export"
# 3) Ottenere pseudocodice leggibile
wasm-decompile target.wasm -o target.dcmp
# 4) Cerca stringhe/URL nelle sezioni dati
wasm-objdump -s target.wasm | less
Flag Funzionalità (Proposte)
| Flag | Abilita |
|---|
--enable-threads | Thread/atomici |
--enable-simd | SIMD |
--enable-bulk-memory | Operazioni di memoria bulk |
--enable-reference-types | Tipi di riferimento |
--enable-all | Tutte le proposte supportate |
Usa questi quando un modulo utilizza funzioni wasm più recenti e gli strumenti predefiniti lo rifiutano.
WABT vs Strumenti Correlati
| Strumento | Ruolo |
|---|
| WABT | Converte/ispeziona/convalida/decompila wasm |
| diswasm | Decompiler pseudocodice di livello superiore |
| wasm-tools | Manipolazione Rust di basso livello |
| Binaryen | Cassetta degli attrezzi della toolchain compilatore (wasm-dis, wasm-opt) |
Risorse