# 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/*)