Solution de prae_gitlab pour Aaarg

intro reverse linux x86/x64

2 décembre 2024

Méthode bourrine avec objdump

Utilisation d’objdump en lui demandant le full-contents et en recherchant le flag FCSC en étant large (regex) :

$ objdump --full-contents aaarg | grep -B5 -A20 "F.*C.*S.*C"
 401280 c3                                   .
Contents of section .fini:
 401284 4883ec08 4883c408 c3                 H...H....
Contents of section .rodata:
 402000 01000200 00000000 00000000 00000000  ................
 402010 46e2808d 43e2808d 53e2808d 43e2808d  F...C...S...C...
 402020 7be2808d 66e2808d 39e2808d 61e2808d  {...f...9...a...
 402030 33e2808d 38e2808d 61e2808d 64e2808d  3...8...a...d...
 402040 61e2808d 63e2808d 65e2808d 39e2808d  a...c...e...9...
 402050 64e2808d 64e2808d 61e2808d 33e2808d  d...d...a...3...
 402060 61e2808d 39e2808d 61e2808d 65e2808d  a...9...a...e...
 402070 35e2808d 33e2808d 65e2808d 37e2808d  5...3...e...7...
 402080 61e2808d 65e2808d 63e2808d 31e2808d  a...e...c...1...
 402090 38e2808d 30e2808d 63e2808d 35e2808d  8...0...c...5...
 4020a0 61e2808d 37e2808d 33e2808d 64e2808d  a...7...3...d...
 4020b0 62e2808d 62e2808d 37e2808d 63e2808d  b...b...7...c...
 4020c0 33e2808d 36e2808d 34e2808d 66e2808d  3...6...4...f...
 4020d0 65e2808d 31e2808d 33e2808d 37e2808d  e...1...3...7...
 4020e0 66e2808d 63e2808d 36e2808d 37e2808d  f...c...6...7...
 4020f0 32e2808d 31e2808d 64e2808d 37e2808d  2...1...d...7...
 402100 39e2808d 39e2808d 37e2808d 63e2808d  9...9...7...c...
 402110 35e2808d 34e2808d 65e2808d 38e2808d  5...4...e...8...
 402120 64e2808d 7d00                        d...}.
Contents of section .eh_frame_hdr:
 402128 011b033b 44000000 07000000 f8eeffff  ...;D...........
 402138 a0000000 28efffff 60000000 58efffff  ....(...`...X...

On constate que notre flag se trouve dans la section .rodata avec des données parasites pour brouiller les pistes.

Méthode bourrine avec xxd

Utilisation de l’outil xxd en lui demandant le dump tout le contenu et en filtrant également pour trouver le flag FCSC :

$ xxd aaarg | grep -A20 "F.*C.*S.*C"
00002010: 46e2 808d 43e2 808d 53e2 808d 43e2 808d  F...C...S...C...
00002020: 7be2 808d 66e2 808d 39e2 808d 61e2 808d  {...f...9...a...
00002030: 33e2 808d 38e2 808d 61e2 808d 64e2 808d  3...8...a...d...
00002040: 61e2 808d 63e2 808d 65e2 808d 39e2 808d  a...c...e...9...
00002050: 64e2 808d 64e2 808d 61e2 808d 33e2 808d  d...d...a...3...
00002060: 61e2 808d 39e2 808d 61e2 808d 65e2 808d  a...9...a...e...
00002070: 35e2 808d 33e2 808d 65e2 808d 37e2 808d  5...3...e...7...
00002080: 61e2 808d 65e2 808d 63e2 808d 31e2 808d  a...e...c...1...
00002090: 38e2 808d 30e2 808d 63e2 808d 35e2 808d  8...0...c...5...
000020a0: 61e2 808d 37e2 808d 33e2 808d 64e2 808d  a...7...3...d...
000020b0: 62e2 808d 62e2 808d 37e2 808d 63e2 808d  b...b...7...c...
000020c0: 33e2 808d 36e2 808d 34e2 808d 66e2 808d  3...6...4...f...
000020d0: 65e2 808d 31e2 808d 33e2 808d 37e2 808d  e...1...3...7...
000020e0: 66e2 808d 63e2 808d 36e2 808d 37e2 808d  f...c...6...7...
000020f0: 32e2 808d 31e2 808d 64e2 808d 37e2 808d  2...1...d...7...
00002100: 39e2 808d 39e2 808d 37e2 808d 63e2 808d  9...9...7...c...
00002110: 35e2 808d 34e2 808d 65e2 808d 38e2 808d  5...4...e...8...
00002120: 64e2 808d 7d00 0000 011b 033b 4400 0000  d...}......;D...
00002130: 0700 0000 f8ee ffff a000 0000 28ef ffff  ............(...
00002140: 6000 0000 58ef ffff 8c00 0000 18f0 ffff  `...X...........
00002150: c800 0000 68f0 ffff e400 0000 f8f0 ffff  ....h...........

Si on veut nettoyer un peu :

$ xxd aaarg \
    | grep -A20 "F.*C.*S.*C" \
    | awk -F'  ' '{ print $2 }' \
    | xargs \
    | tr -d '. ' \
    | grep -o "FCSC{.*}"
FCSC{f9a38adace9dda3a9ae53e7aec180c5a73dbb7c364fe137fc6721d7997c54e8d}

Nettoyage rapide, on peut trouver mieux, mais ça fait le job :)

Recherche plus fine avec radare2

Maintenant, on peut utiliser les outils radare2 et notamment rafind qui permet d’utiliser une regex, et nous recherchons une occurence large de FCSC{ afin de trouver le bon offset des données :

$ rafind2 -e "/F.*C.*S.*C.*{/" ./aaarg
0x2010

Notre flag semble se trouver à l’offset 0x2010.

Voyons cela avec radare2 en lui demandant d’aller à l’offset 0x2010 (-ns) et d’afficher le résultat (-qc) :

$ r2 -ns '0x2010' -qc 'x 277' ./aaarg
0x00002010  46e2 808d 43e2 808d 53e2 808d 43e2 808d  F...C...S...C...
0x00002020  7be2 808d 66e2 808d 39e2 808d 61e2 808d  {...f...9...a...
0x00002030  33e2 808d 38e2 808d 61e2 808d 64e2 808d  3...8...a...d...
0x00002040  61e2 808d 63e2 808d 65e2 808d 39e2 808d  a...c...e...9...
0x00002050  64e2 808d 64e2 808d 61e2 808d 33e2 808d  d...d...a...3...
0x00002060  61e2 808d 39e2 808d 61e2 808d 65e2 808d  a...9...a...e...
0x00002070  35e2 808d 33e2 808d 65e2 808d 37e2 808d  5...3...e...7...
0x00002080  61e2 808d 65e2 808d 63e2 808d 31e2 808d  a...e...c...1...
0x00002090  38e2 808d 30e2 808d 63e2 808d 35e2 808d  8...0...c...5...
0x000020a0  61e2 808d 37e2 808d 33e2 808d 64e2 808d  a...7...3...d...
0x000020b0  62e2 808d 62e2 808d 37e2 808d 63e2 808d  b...b...7...c...
0x000020c0  33e2 808d 36e2 808d 34e2 808d 66e2 808d  3...6...4...f...
0x000020d0  65e2 808d 31e2 808d 33e2 808d 37e2 808d  e...1...3...7...
0x000020e0  66e2 808d 63e2 808d 36e2 808d 37e2 808d  f...c...6...7...
0x000020f0  32e2 808d 31e2 808d 64e2 808d 37e2 808d  2...1...d...7...
0x00002100  39e2 808d 39e2 808d 37e2 808d 63e2 808d  9...9...7...c...
0x00002110  35e2 808d 34e2 808d 65e2 808d 38e2 808d  5...4...e...8...
0x00002120  64e2 808d 7d                             d...}

Il suffit de nettoyer les caractères non-utiles à notre flag final, et nous trouvons bien notre flag :

FCSC{f9a38adace9dda3a9ae53e7aec180c5a73dbb7c364fe137fc6721d7997c54e8d}