Solution de OliverSwift pour canflag

hardware bus de communication

20 janvier 2025

On utilise Wireshark pour ouvrir le fichier de capture ‘canflag.pcap’.

On distingue des trames normales et des trames dites ‘étendues’. Les ID des trames sont toutes paires. Les trames contiennent parfois des données, et elles contiennent toujours un code ASCII.

D’ailleurs la trame n°62 contient le texte habituel ‘FCSC’:

Frame 62: 16 bytes on wire (128 bits), 16 bytes captured (128 bits)
Controller Area Network, Ext. ID: 2 (0x2), Length: 4
    ...0 0000 0000 0000 0000 0000 0000 0010 = ID: 2 (0x00000002)
    1... .... .... .... .... .... .... .... = Extended Flag: True
    .0.. .... .... .... .... .... .... .... = Remote Transmission Request Flag: False
    ..0. .... .... .... .... .... .... .... = Error Message Flag: False
    Frame-Length: 4
    Reserved: 000000
    Padding: 00000000
Data (4 bytes)
    Data: 46435343
    [Length: 4]

0000   80 00 00 02 04 00 00 00 46 43 53 43 00 00 00 00   ........FCSC....

Mais l’ordre des trames semblent complètement aléatoire.

Cependant l’ID pourrait être une position en mémoire (ou un index). Mais il arrive que la même ID se présente en adresse normale OU étendue. Et là le contenu diffère. Comme les adresses (ID) sont toutes paires, on va faire une hypothèse que si la trame est étendue c’est la position principale et si elle ne l’est pas c’est la position “suivante”.

Si on regarde la trame N°16 avec ID 2 non étendue:

Frame 16: 72 bytes on wire (576 bits), 72 bytes captured (576 bits)
Controller Area Network, ID: 2 (0x2), Length: 5
    .... .... .... .... .... .000 0000 0010 = ID: 2 (0x002)
    0... .... .... .... .... .... .... .... = Extended Flag: False
    .0.. .... .... .... .... .... .... .... = Remote Transmission Request Flag: False
    ..0. .... .... .... .... .... .... .... = Error Message Flag: False
    Frame-Length: 5
    Reserved: 000000
    Padding: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Data (5 bytes)
    Data: 7b61613965
    [Length: 5]

0000   00 00 00 02 05 00 00 00 7b 61 61 39 65 00 00 00   ........{aa9e...
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0020   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0040   00 00 00 00 00 00 00 00                           ........

Cela semble être la suite de la trame ID N°2 étendue.

On remarque que la longueur de la trame encode la longueur du texte utile.

Les trames de longueur nulles (CAN.len == 0), seront ignorées. On va donc partir du principe que l’on peut trier les trames par ID croissantes avec le flag étendu en précédence (pour la même ID).

Pour exploiter les données on sauve les traces sous forme JSON avec la fonction d’exportation de Wireshark.

Puis on écrit un petit programme Python pour collecter les données des trames en partant du principe que les ID (ext ou pas) nous indique l’ordre de rangement (ou d’apparition):

import json

pcap = open("dump.json","r").read()
packets = json.loads(pcap)

# Create an array of an arbitrary size of 100 elements
flag = [ '' for _ in range(100)]

# Collect data, and place them according to ID/ext value
for packet in packets:
    can = packet['_source']['layers']['can']
    # Length not null
    if not can['can.len'] == '0':
        # Base position = ID value
        pos = int(can['can.id'])
        # If frame is extended, increment position
        if not can['can.flags.xtd'] == '1':
            pos += 1
        # Store data
        flag[pos] = packet['_source']['layers']['data']['data.data']

# Concatenate data when not empty. Represented as ':' separated hexa values
f = ''
for i in range(len(flag)):
    if flag[i] != '':
        f += flag[i] + ":"

# Get rid of colons
f = f.replace(':','')

# Parse as hex
fb = bytes.fromhex(f)

# Decode to text and print out
print(fb.decode())

On l’exécute:

$ python3 flag.py
FCSC{aa9edf0a2ea5e233bdc3fc49535a09cc055a456df7db4ab8e5f6b47b9f603d6a1171d20b15458b7b44ac1ffbeb9ca92ac1d8aee3cd919184a27d6afd2dd4f01c50b0e57be6a1560a78e682556c529f74d8b04f8e660ce71f6e21013d1f2482f60ce1732e5983dbc14f37020b5a439e60c6797295c3cc58757bdeaa85a96eef37}

Voilà un joli flag bien imposant.