Practical Binary Analysis – CTF Walkthrough – Nivelul 3, 4

  • 2 minute de citit
  • 6 exemple de cod
  • 1 imagine

Disponibil și în English

Salut,

În acest articol vă prezint soluția mea pentru CTF-ul din Capitolul 5 al cărții Practical Binary Analysis.

Pentru acest binar, indiciul este să repari patru lucruri stricate.

Rularea comenzii file ne dă următorul răspuns:

binary@binary-VirtualBox:~/ctf$ file ./lvl3 ./lvl3: ERROR: ELF 64-bit LSB executable, Motorola Coldfire, version 1 (Novell Modesto) error reading (Invalid argument)

Iar comanda readelf ne dă:

binary@binary-VirtualBox:~/ctf$ readelf -h ./lvl3 ELF Header:  Magic:   7f 45 4c 46 02 01 01 0b 00 00 00 00 00 00 00 00   Class:                             ELF64  Data:                              2's complement, little endian  Version:                           1 (current)  OS/ABI:                            Novell - Modesto  ABI Version:                       0  Type:                              EXEC (Executable file)  Machine:                           Motorola Coldfire  Version:                           0x1  Entry point address:               0x4005d0  Start of program headers:          4022250974 (bytes into file)  Start of section headers:          4480 (bytes into file)  Flags:                             0x0  Size of this header:               64 (bytes)  Size of program headers:           56 (bytes)  Number of program headers:         9  Size of section headers:           64 (bytes)  Number of section headers:         29  Section header string table index: 28readelf: Error: Reading 0x1f8 bytes extends past end of file for program headers

În acest moment era clar că header-ul ELF este stricat. Ca să-l repar, am deschis Wikipedia și specificația ELF.

Parcurgând manual fiecare câmp, cu Binary Ninj. Verificând offset-ul octetului curent, la 0x07, Wikipedia spune: It is often set to 0 regardless of the target platform. Am schimbat valoarea în 0x00. (Notă: cred că acest câmp era probabil bun și înainte)

La offset-ul 0x12, valoarea Specifies target instruction set architecture și în prezent este invalidă. Căutând pe Google, am găsit un articol intitulat: Novell's Next Generation OS Will Natively Support Intel's Future IA-64 Architecture, așa că am setat valoarea la 0x3E.

binjahex.jpg La offset-ul 0x20 avem e_phoff, care Points to the start of the program header table. It usually follows the file header immediately, making the offset 0x34 or 0x40 for 32- and 64-bit ELF executables, respectively. Valoarea de ad be ef este evident invalidă. Am înlocuit-o cu 40 00 00 00.

În acest moment am crezut că am reparat binarul și l-am rulat. A rulat, dar mi-a dat un flag invalid.

Dacă rulați următoarea comandă:

binary@binary-VirtualBox:/media/sf_Dropzone$ readelf -S ./lvl3 | grep .text  [14] .text             NOBITS           0000000000400550  00000550

Veți vedea că secțiunea .text este marcată ca 0x8 - NOBITS, când ar trebui să fie 0x1 - PROGBITS. Pentru a face schimbarea, am folosit Binary Ninja ca editor hexazecimal, deschizând binarul în modul raw.

Din comanda readelf:

  Start of section headers:          4480 (bytes into file)

Începutul tabelei de secțiuni este la 4480 de octeți. O intrare din tabela de secțiuni are lungimea de 0x40 de octeți. 4480 în hexazecimal -> 0x1180. 0x40 * 14 + 0x1180 = 0x1500.

La offset-ul 0x1504 schimbăm tipul din SHT_NOBITS în SHT_PROGBITS.

După ce rulăm binarul, obținem flag-ul valid:

3a5c381e40d2fffd95ba4452a0fb4a40  ./lvl3

După ce am terminat nivelul 3, voiam să mă duc la culcare, dar în schimb m-am gândit să rulez ltrace și strace pe binar și am obținut asta:

binary@binary-VirtualBox:~/ctf$ ltrace ./lvl4__libc_start_main(0x4004a0, 1, 0x7ffd6fb460e8, 0x400650 <unfinished ...>setenv("FLAG", "656cf8aecb76113a4dece1688c61d0e7"..., 1)             = 0+++ exited (status 0) +++

Nu mă așteptam la asta, dar foarte frumos.

Mulțumesc pentru lectură!