Analyse préliminaire
Après avoir téléchargé le fichier je l’ai simplement ouvert en faisant un cat
:
$ cat aaarg.txt
ELF>P@@?1@8
@@@@@h??@?@@@??@@??
C’est un fichier binaire mais qui est de type “ELF”. Une recherche internet plus tard je sais que c’est un fichier exécutable Linux.
Résolution
Je l’ai copié dans une VM Debian pour le lancer mais rien ne se passe.
Après un peu de recherche je tombe sur readelf
et je lance une analyse des headers du fichier (qui semble être la suite d’instruction exécutée par le fichier).
$ readelf -S aaarg.elf
There are 28 section headers, starting at offset 0x3180:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 00000000004002a8 000002a8
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 00000000004002c4 000002c4
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.bu[...] NOTE 00000000004002e4 000002e4
0000000000000024 0000000000000000 A 0 0 4
[ 4] .hash HASH 0000000000400308 00000308
000000000000002c 0000000000000004 A 6 0 8
[ 5] .gnu.hash GNU_HASH 0000000000400338 00000338
0000000000000024 0000000000000000 A 6 0 8
[ 6] .dynsym DYNSYM 0000000000400360 00000360
0000000000000090 0000000000000018 A 7 1 8
[ 7] .dynstr STRTAB 00000000004003f0 000003f0
000000000000004c 0000000000000000 A 0 0 1
[ 8] .gnu.version VERSYM 000000000040043c 0000043c
000000000000000c 0000000000000002 A 6 0 2
[ 9] .gnu.version_r VERNEED 0000000000400448 00000448
0000000000000020 0000000000000000 A 7 1 8
[10] .rela.dyn RELA 0000000000400468 00000468
0000000000000048 0000000000000018 A 6 0 8
[11] .rela.plt RELA 00000000004004b0 000004b0
0000000000000030 0000000000000018 AI 6 23 8
[12] .init PROGBITS 0000000000401000 00001000
0000000000000017 0000000000000000 AX 0 0 4
[13] .plt PROGBITS 0000000000401020 00001020
0000000000000030 0000000000000010 AX 0 0 16
[14] .text PROGBITS 0000000000401050 00001050
0000000000000231 0000000000000000 AX 0 0 16
[15] .fini PROGBITS 0000000000401284 00001284
0000000000000009 0000000000000000 AX 0 0 4
[16] .rodata PROGBITS 0000000000402000 00002000
0000000000000126 0000000000000000 A 0 0 16
[17] .eh_frame_hdr PROGBITS 0000000000402128 00002128
0000000000000044 0000000000000000 A 0 0 4
[18] .eh_frame PROGBITS 0000000000402170 00002170
0000000000000120 0000000000000000 A 0 0 8
[19] .init_array INIT_ARRAY 0000000000403e00 00002e00
0000000000000008 0000000000000008 WA 0 0 8
[20] .fini_array FINI_ARRAY 0000000000403e08 00002e08
0000000000000008 0000000000000008 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000403e10 00002e10
00000000000001e0 0000000000000010 WA 7 0 8
[22] .got PROGBITS 0000000000403ff0 00002ff0
0000000000000010 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 0000000000404000 00003000
0000000000000028 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000404028 00003028
0000000000000010 0000000000000000 WA 0 0 8
[25] .bss NOBITS 0000000000404038 00003038
0000000000000010 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00003038
0000000000000053 0000000000000001 MS 0 0 1
[27] .shstrtab STRTAB 0000000000000000 0000308b
00000000000000f3 0000000000000000 0 0 1
Une fois la liste en poche, je teste de dump le contenu de chaque section intéressante (.data
, .shstrtab
…) pour arriver à .rodata
.
$ readelf --string-dump=.rodata aaarg.elf
[ 10] FCSC{f9a38adace9dda3a9ae53e7aec180c5a73dbb7c364fe137fc6721d7997c54e8d}
Bonus
Une fois soulagé d’avoir le flag, je retourne sur une intuition que j’ai eu :
Et si c’était une devinette ?
Le fichier s’appelle aaarg
, comme arg
pour argument mais avec 2 a
en trop et j’ai testé quelque possibilité puis bingo.
$ ./aaarg.elf aa
$ ./aaarg.elf -a
$ ./aaarg.elf -2a
$ ./aaarg.elf -2
FCSC{f9a38adace9dda3a9ae53e7aec180c5a73dbb7c364fe137fc6721d7997c54e8d}