Solution de sorgs-varte pour Aaarg

intro reverse linux x86/x64

27 décembre 2023

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}