# libflaggen writeup Скачиваем .so файл, смотрим: ```shell ❯ ls -l итого 16 -rw-rw-r-- 1 rerand0m rerand0m 16144 окт 5 13:20 libflaggen-f2c2f9306bdbae9522d200db5bd9f55d.so ❯ mv libflaggen-f2c2f9306bdbae9522d200db5bd9f55d.so libflaggen.so ❯ file libflaggen.so libflaggen.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=7cde260814d11798b4c5ca7b87f3a5a40b1aeb75, not stripped ❯ objdump -x libflaggen.so libflaggen.so: формат файла elf64-x86-64 libflaggen.so архитектура: i386:x86-64, флаги 0x00000150: HAS_SYMS, DYNAMIC, D_PAGED начальный адрес 0x0000000000001050 Заголовок программы: LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12 filesz 0x00000000000004c0 memsz 0x00000000000004c0 flags r-- LOAD off 0x0000000000001000 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**12 filesz 0x000000000000025d memsz 0x000000000000025d flags r-x LOAD off 0x0000000000002000 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**12 filesz 0x00000000000000bc memsz 0x00000000000000bc flags r-- LOAD off 0x0000000000002e10 vaddr 0x0000000000003e10 paddr 0x0000000000003e10 align 2**12 filesz 0x000000000000027f memsz 0x00000000000002b0 flags rw- DYNAMIC off 0x0000000000002e20 vaddr 0x0000000000003e20 paddr 0x0000000000003e20 align 2**3 filesz 0x00000000000001c0 memsz 0x00000000000001c0 flags rw- NOTE off 0x0000000000000238 vaddr 0x0000000000000238 paddr 0x0000000000000238 align 2**2 filesz 0x0000000000000024 memsz 0x0000000000000024 flags r-- EH_FRAME off 0x0000000000002000 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**2 filesz 0x0000000000000024 memsz 0x0000000000000024 flags r-- STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4 filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw- RELRO off 0x0000000000002e10 vaddr 0x0000000000003e10 paddr 0x0000000000003e10 align 2**0 filesz 0x00000000000001f0 memsz 0x00000000000001f0 flags r-- Динамический раздел: NEEDED libc.so.6 INIT 0x0000000000001000 FINI 0x0000000000001250 INIT_ARRAY 0x0000000000003e10 INIT_ARRAYSZ 0x0000000000000008 FINI_ARRAY 0x0000000000003e18 FINI_ARRAYSZ 0x0000000000000008 GNU_HASH 0x0000000000000260 STRTAB 0x0000000000000348 SYMTAB 0x0000000000000288 STRSZ 0x0000000000000088 SYMENT 0x0000000000000018 PLTGOT 0x0000000000004000 PLTRELSZ 0x0000000000000018 PLTREL 0x0000000000000007 JMPREL 0x00000000000004a8 RELA 0x0000000000000400 RELASZ 0x00000000000000a8 RELAENT 0x0000000000000018 VERNEED 0x00000000000003e0 VERNEEDNUM 0x0000000000000001 VERSYM 0x00000000000003d0 RELACOUNT 0x0000000000000003 Версии ссылок: требуется из libc.so.6: 0x09691a75 0x00 02 GLIBC_2.2.5 Разделы: Idx Name Size VMA LMA File off Algn 0 .note.gnu.build-id 00000024 0000000000000238 0000000000000238 00000238 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .gnu.hash 00000028 0000000000000260 0000000000000260 00000260 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .dynsym 000000c0 0000000000000288 0000000000000288 00000288 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .dynstr 00000088 0000000000000348 0000000000000348 00000348 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .gnu.version 00000010 00000000000003d0 00000000000003d0 000003d0 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .gnu.version_r 00000020 00000000000003e0 00000000000003e0 000003e0 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 .rela.dyn 000000a8 0000000000000400 0000000000000400 00000400 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .rela.plt 00000018 00000000000004a8 00000000000004a8 000004a8 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 8 .init 0000001b 0000000000001000 0000000000001000 00001000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 9 .plt 00000020 0000000000001020 0000000000001020 00001020 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 10 .plt.got 00000008 0000000000001040 0000000000001040 00001040 2**3 CONTENTS, ALLOC, LOAD, READONLY, CODE 11 .text 00000200 0000000000001050 0000000000001050 00001050 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 12 .fini 0000000d 0000000000001250 0000000000001250 00001250 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 13 .eh_frame_hdr 00000024 0000000000002000 0000000000002000 00002000 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 14 .eh_frame 00000094 0000000000002028 0000000000002028 00002028 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 15 .init_array 00000008 0000000000003e10 0000000000003e10 00002e10 2**3 CONTENTS, ALLOC, LOAD, DATA 16 .fini_array 00000008 0000000000003e18 0000000000003e18 00002e18 2**3 CONTENTS, ALLOC, LOAD, DATA 17 .dynamic 000001c0 0000000000003e20 0000000000003e20 00002e20 2**3 CONTENTS, ALLOC, LOAD, DATA 18 .got 00000020 0000000000003fe0 0000000000003fe0 00002fe0 2**3 CONTENTS, ALLOC, LOAD, DATA 19 .got.plt 00000020 0000000000004000 0000000000004000 00003000 2**3 CONTENTS, ALLOC, LOAD, DATA 20 .data 0000006f 0000000000004020 0000000000004020 00003020 2**5 CONTENTS, ALLOC, LOAD, DATA 21 .bss 00000030 0000000000004090 0000000000004090 0000308f 2**3 ALLOC 22 .comment 00000035 0000000000000000 0000000000000000 0000308f 2**0 CONTENTS, READONLY SYMBOL TABLE: 0000000000000238 l d .note.gnu.build-id 0000000000000000 .note.gnu.build-id 0000000000000260 l d .gnu.hash 0000000000000000 .gnu.hash 0000000000000288 l d .dynsym 0000000000000000 .dynsym 0000000000000348 l d .dynstr 0000000000000000 .dynstr 00000000000003d0 l d .gnu.version 0000000000000000 .gnu.version 00000000000003e0 l d .gnu.version_r 0000000000000000 .gnu.version_r 0000000000000400 l d .rela.dyn 0000000000000000 .rela.dyn 00000000000004a8 l d .rela.plt 0000000000000000 .rela.plt 0000000000001000 l d .init 0000000000000000 .init 0000000000001020 l d .plt 0000000000000000 .plt 0000000000001040 l d .plt.got 0000000000000000 .plt.got 0000000000001050 l d .text 0000000000000000 .text 0000000000001250 l d .fini 0000000000000000 .fini 0000000000002000 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr 0000000000002028 l d .eh_frame 0000000000000000 .eh_frame 0000000000003e10 l d .init_array 0000000000000000 .init_array 0000000000003e18 l d .fini_array 0000000000000000 .fini_array 0000000000003e20 l d .dynamic 0000000000000000 .dynamic 0000000000003fe0 l d .got 0000000000000000 .got 0000000000004000 l d .got.plt 0000000000000000 .got.plt 0000000000004020 l d .data 0000000000000000 .data 0000000000004090 l d .bss 0000000000000000 .bss 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 l df *ABS* 0000000000000000 crtstuff.c 0000000000001050 l F .text 0000000000000000 deregister_tm_clones 0000000000001080 l F .text 0000000000000000 register_tm_clones 00000000000010c0 l F .text 0000000000000000 __do_global_dtors_aux 0000000000004090 l O .bss 0000000000000001 completed.8059 0000000000003e18 l O .fini_array 0000000000000000 __do_global_dtors_aux_fini_array_entry 0000000000001100 l F .text 0000000000000000 frame_dummy 0000000000003e10 l O .init_array 0000000000000000 __frame_dummy_init_array_entry 0000000000000000 l df *ABS* 0000000000000000 flag.c 0000000000004040 l O .data 000000000000004f fflag 00000000000040a0 l O .bss 000000000000000c lfsr 00000000000040b0 l O .bss 000000000000000c start_state 0000000000000000 l df *ABS* 0000000000000000 crtstuff.c 00000000000020b8 l O .eh_frame 0000000000000000 __FRAME_END__ 0000000000000000 l df *ABS* 0000000000000000 0000000000001250 l F .fini 0000000000000000 _fini 0000000000004020 l O .data 0000000000000000 __dso_handle 0000000000003e20 l O .dynamic 0000000000000000 _DYNAMIC 0000000000002000 l .eh_frame_hdr 0000000000000000 __GNU_EH_FRAME_HDR 0000000000004090 l O .data 0000000000000000 __TMC_END__ 0000000000004000 l O .got.plt 0000000000000000 _GLOBAL_OFFSET_TABLE_ 0000000000001000 l F .init 0000000000000000 _init 0000000000000000 F *UND* 0000000000000000 putchar@@GLIBC_2.2.5 0000000000000000 w *UND* 0000000000000000 _ITM_deregisterTMCloneTable 0000000000004098 g O .bss 0000000000000004 g_threadsafe 0000000000000000 w *UND* 0000000000000000 __gmon_start__ 0000000000001110 g F .text 0000000000000140 getflag 0000000000000000 w *UND* 0000000000000000 _ITM_registerTMCloneTable 0000000000000000 w F *UND* 0000000000000000 __cxa_finalize@@GLIBC_2.2.5 ❯ objdump -M intel -d libflaggen.so libflaggen.so: формат файла elf64-x86-64 <...> 0000000000001110 <getflag>: 1110: 81 ff 0a 1a 00 00 cmp edi,0x1a0a 1116: 74 08 je 1120 <getflag+0x10> 1118: 31 c0 xor eax,eax 111a: c3 ret 111b: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0] 1120: 48 b8 1d 7b 81 63 77 movabs rax,0x2122df7763817b1d 1127: df 22 21 112a: 41 55 push r13 <...> ``` *Вывод немного обрезал.* Можно долго разбираться, что же там происходит в этой функции, а можно просто запустить. Гуглим "x86-64 calling convention by gcc" чтобы понять сигнатуру функции. Не просто так я оставил начало функции, там видно сравнение регистра edi с значением 0x1a0a. Понимаем, что как минимум один аргумент нам нужен. > Ну это вы, а я забил, т.к. я знаю как это работает и что сломается, а что нет, поэтому тупо использовал машинное слово (int) Далее пишем простейшую программу, дабы задействовать нужную функцию этой библиотеки. ```shell ❯ cat main.c extern int getflag(int a); int main() { getflag(0x1a0a); return 0; } ❯ gcc main.c -o main -lflaggen -L. -Wl,-rpath,. ❯ ./main flag{pl34s3_sp34k_3ngl1sh_m1n10n!_1v3_been_b4k1ng_und3r_th0s3_st00d1o_l1ghts!} ``` **-lflaggen** указывает на использование библиотеки libflaggen.so (обратите внимание на отстутсвие lib и .so в аргументе) **-L.** указывает, где искать библиотеки (в этой же директории, у меня. Если libflaggen.so лежит отдельно, то параметр должен меняться соответственно, например, *-L/home/rerand0m/Downloads/*) **-Wl,-rpath,.** указывает компилятору подсказать полученному исполняемому файлу, где искать библиотеки. (Опять же, в этой же директории у меня. Если libflaggen.so лежит отдельно, то параметр должен меняться соответственно, например, *-Wl,-rpath,/home/rerand0m/Downloads/*)