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.
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 00000550Veț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 ./lvl3După 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ă!