Secure Digital
2 minutos de lectura
Se nos dice que alguien ha leído la clave maestra de una tarjeta microSD, y se nos dan las trazas de las señales en un archivo trace_captured.sal
.
Análisis de señales
Podemos usar la lógica de saleae 2 para analizar los rastros, y tenemos esto:
SPI
Si investigamos un poco, descubriremos que las tarjetas microSD usan Serial Peripheral Interface (SPI) como protocolo de comunicación. Comparando las señales que tenemos con las que vemos en SPI Analyzer - User Guide, podemos concluir que el Channel 0 y el Channel 1 son MISO o MOSI, el Channel 2 es Enable y el Channel 3 es Clock, por lo que podemos añadir el analizador:
En este punto, vemos que no hay errores en la consola, por lo que todo se ve correcto.
Decodificación
Lo siguiente que podemos hacer es volcar toda esta información a un archivo CSV. Podemos decodificarlo como ASCII:
Y tenemos este archivo CSV:
$ head data.csv; echo; tail data.csv
Time [s],Packet ID,MOSI,MISO
2.481394520000000,0,\xFF,\xFF
2.481428680000000,0,@,\xFF
2.481472660000000,0,\0,\xFF
2.481513460000000,0,\0,\xFF
2.481550740000000,0,\0,\xFF
2.481584520000000,0,\0,\xFF
2.481618060000000,0,\x95,\xFF
2.481651280000000,0,\xFF,\xFF
2.481685000000000,0,\xFF,\x01
2.495525140000000,0,\xFF,\0
2.495528780000000,0,\xFF,\0
2.495532400000000,0,\xFF,\0
2.495536040000000,0,\xFF,\0
2.495539660000000,0,\xFF,\0
2.495543300000000,0,\xFF,\0
2.495546920000000,0,\xFF,\0
2.495550560000000,0,\xFF,\0
2.495556180000000,0,\xFF,\x86
2.495560320000000,0,\xFF,b
Si echamos un vistazo a todo el archivo CSV, veremos muchos valores \xFF,\xFF
y \xFF,\0
. Vamos a deshacernos de ellos:
$ grep -vE '\\xFF,\\xFF|\\xFF,\\0' data.csv | tail
2.494027840000000,0,\xFF,v
2.494031460000000,0,\xFF,1
2.494035100000000,0,\xFF,c
2.494038720000000,0,\xFF,3
2.494042340000000,0,\xFF,5
2.494045980000000,0,\xFF,}
2.494049600000000,0,\xFF,\r
2.494053240000000,0,\xFF,\n
2.495556180000000,0,\xFF,\x86
2.495560320000000,0,\xFF,b
Parece prometedor, ¿verdad? Tomemos más valores:
$ grep -vE '\\xFF,\\xFF|\\xFF,\\0' data.csv | tail -55
2.493864540000000,0,\xFF,H
2.493868160000000,0,\xFF,T
2.493871800000000,0,\xFF,B
2.493875420000000,0,\xFF,{
2.493879060000000,0,\xFF,u
2.493882680000000,0,\xFF,n
2.493886320000000,0,\xFF,p
2.493889940000000,0,\xFF,2
2.493893560000000,0,\xFF,0
2.493897200000000,0,\xFF,7
2.493900820000000,0,\xFF,3
2.493904460000000,0,\xFF,c
2.493908080000000,0,\xFF,7
2.493911720000000,0,\xFF,3
2.493915340000000,0,\xFF,d
2.493918980000000,0,\xFF,_
2.493922600000000,0,\xFF,5
2.493926220000000,0,\xFF,3
2.493929860000000,0,\xFF,2
2.493933480000000,0,\xFF,1
2.493937120000000,0,\xFF,4
2.493940740000000,0,\xFF,1
2.493944380000000,0,\xFF,_
2.493948000000000,0,\xFF,p
2.493951620000000,0,\xFF,2
2.493955260000000,0,\xFF,0
2.493958880000000,0,\xFF,7
2.493962520000000,0,\xFF,0
2.493966140000000,0,\xFF,c
2.493969780000000,0,\xFF,0
2.493973400000000,0,\xFF,1
2.493977040000000,0,\xFF,5
2.493980660000000,0,\xFF,_
2.493984280000000,0,\xFF,0
2.493987920000000,0,\xFF,n
2.493991540000000,0,\xFF,_
2.493995180000000,0,\xFF,5
2.493998800000000,0,\xFF,3
2.494002440000000,0,\xFF,c
2.494006060000000,0,\xFF,u
2.494009700000000,0,\xFF,2
2.494013320000000,0,\xFF,3
2.494016940000000,0,\xFF,_
2.494020580000000,0,\xFF,d
2.494024200000000,0,\xFF,3
2.494027840000000,0,\xFF,v
2.494031460000000,0,\xFF,1
2.494035100000000,0,\xFF,c
2.494038720000000,0,\xFF,3
2.494042340000000,0,\xFF,5
2.494045980000000,0,\xFF,}
2.494049600000000,0,\xFF,\r
2.494053240000000,0,\xFF,\n
2.495556180000000,0,\xFF,\x86
2.495560320000000,0,\xFF,b
¡Excelente! ¡Podemos ver la flag!
Flag
Al final, podemos encontrar la flag usando un poco de shell scripting:
$ grep -vE '\\xFF,\\xFF|\\xFF,\\0' data.csv | awk -F , '{ print $4 }' | tr -d \\n | grep -oE 'HTB{.*?}' | sort -u
HTB{unp2073c73d_532141_p2070c015_0n_53cu23_d3v1c35}