Hubbub
3 minutos de lectura
Se nos proporciona un archivo binario llamado Hubbub:
$ file Hubbub
Hubbub: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
Configuración para Arduino
Este archivo corresponde a un firmware extraído de Arduino. Se puede notar esto mirando la salida de strings:
$ strings Hubbub | grep ino
/home/jamie/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino
/home/jamie/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include
/home/jamie/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/eightanaloginputs/../standard
Hubbub.ino
pins_arduino.h
Podemos usar Ghidra para analizar este archivo. Pero primero, necesitamos configurar el soporte de AVR en Ghidra. Para esto, seguí esta guía, que dice lo siguiente:
First, place the file atmega328.pspec in the directory
Ghidra/Processors/Atmel/data/languages. Then, modify the fileGhidra/Processors/Atmel/data/languages/avr8.ldefsand add the<language>tag highlighted in the following listing:
<?xml version="1.0" encoding="UTF-8"?>
<language_definitions>
<!-- [...] -->
<language processor="AVR8"
endian="little"
size="16"
variant="atmega328"
version="1.0"
slafile="avr8eind.sla"
processorspec="atmega328.pspec"
manualindexfile="../manuals/AVR8.idx"
id="avr8:LE:16:atmega328">
<description>AVR8 for an Atmega 328</description>
<compiler name="gcc" spec="avr8egcc.cspec" id="gcc"/>
<external_name tool="gnu" name="avr:51"/>
<external_name tool="gnu" name="avr:6"/>
<external_name tool="IDA-PRO" name="avr"/>
</language>
<!-- [...] -->
</language_definitions>
Descompilación
En este punto, podemos cargar el binario en Ghidra, seleccionando la arquitectura atmega328. Veremos la siguiente función main:
void main() {
// ...
delay(0, 400);
tone(0, 300);
delay(0, 400);
delay(0, 400);
tone(0, 300);
delay(0, 400);
delay(0, 400);
tone(0, 300);
delay(0, 400);
delay(0, 400);
tone(0, 300);
delay(0, 400);
delay(0, 1000);
delay(0, 400);
tone(0, 600);
delay(0, 400);
delay(0, 1000);
delay(0, 400);
tone(0, 600);
delay(0, 400);
delay(0, 400);
// ...
tone(0, 600);
delay(0, 400);
delay(0, 1000);
delay(0, 400);
tone(0, 600);
delay(0, 400);
delay(0, 400);
tone(0, 300);
delay(0, 400);
do {
/* WARNING: Do nothing block with infinite loop */
} while (true);
}
Tuve que ajustar algunas llamadas funciones que no se interpretaron correctamente. Es decir, tone espera recibir dos argumentos (pin y frequency); y delay espera recibir un solo argumento (ms). No pude arreglar el formato de la función delay por algún motivo, pero no importó al final.
No sé si podemos ejecutar este binario en una herramienta de simulación o no. El hecho es que no encontré ninguna herramienta para esto, por lo que me quedé con mis habilidades de guessing. Como estamos lidiando con tone y delay, tal vez podamos pensar en código Morse. Y de hecho, ¡es código Morse!
Código Morse
Parece ser que tone(0, 300) significa . y tone(0, 600) significa -. Luego, delay(0, 1000) es un separador entre símbolos y delay(0, 2000) es un separador entre palabras:
// code: .... (H)
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,1000); // symbol separator
// code: - (T)
delay(0,400); tone(0,600); delay(0,400);
delay(0,1000); // symbol separator
// code: -... (B)
delay(0,400); tone(0,600); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,2000); // word separator
// code: .- (A)
delay(0,400); tone(0,300); delay(0,400);
delay(0,400); tone(0,600); delay(0,400);
delay(0,2000); // word separator
// code: -. (N)
delay(0,400); tone(0,600); delay(0,400);
delay(0,400); tone(0,300); delay(0,400);
delay(0,1000); // symbol separator
// code: --- (O)
delay(0,400); tone(0,600); delay(0,400);
delay(0,400); tone(0,600); delay(0,400);
delay(0,400); tone(0,600); delay(0,400);
delay(0,1000); // symbol separator
// ...
Entonces, manualmente, tenemos HTB A NO.
Flag
Podemos usar algunas habilidades de edición de texto para transformar cada una de las partes a ., -, espacios como separador entre símbolos y / como separadores entre palabras. Después, se lo lanzamos a CyberChef y listo:

Y entonces la flag es:
HTB{A NOISY BUZZER COMMANDS ATTENTION}