{"id":33116,"date":"2026-02-18T05:00:00","date_gmt":"2026-02-18T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=33116"},"modified":"2026-02-19T13:14:59","modified_gmt":"2026-02-19T12:14:59","slug":"elfy-i-gobliny-linuxa","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/elfy-i-gobliny-linuxa\/","title":{"rendered":"ELFy i Gobliny Linuxa"},"content":{"rendered":"\n<p>Tematem artyku\u0142u jest analiza binarna plik\u00f3w ELF (skr\u00f3t od Executable and Linkable Format) i zrozumienie ich struktury. We wpisie przedstawi\u0119 przydatne narz\u0119dzia do analizy tego typu plik\u00f3w. W celach demonstracyjnych w katalogu <code>test_virus\/<\/code> przygotowa\u0142em demonstracyjny kod (Goblin), kt\u00f3ry zostanie zbudowany i wstrzykni\u0119ty do pliku wykonywalnego (ELF).<\/p>\n\n\n\n<p><strong>Uwaga! <\/strong>Ten dokument zawiera analizy niskopoziomowe plik\u00f3w ELF oraz fragmenty kodu przygotowane wy\u0142\u0105cznie w celach edukacyjnych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przedstawiamy ELFa<\/strong><\/h2>\n\n\n\n<p>ELF to standardowy format plik\u00f3w binarnych u\u017cywany g\u0142\u00f3wnie w systemach typu Unix, takich jak Linux czy FreeBSD. S\u0142u\u017cy do przechowywania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>program\u00f3w wykonywalnych,<\/li>\n\n\n\n<li>bibliotek wsp\u00f3\u0142dzielonych (np. plik\u00f3w <code>.so<\/code>),<\/li>\n\n\n\n<li>kodu obiektowego,<\/li>\n\n\n\n<li>zrzut\u00f3w pami\u0119ci (<code>core dumps<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>Jest odpowiednikiem plik\u00f3w .exe zapisanych w formacie PE (Portable Executable), znanych z systemu Windows.<\/p>\n\n\n\n<p>Format ELF wykorzystywany jest r\u00f3wnie\u017c w projektach embedded jako wynikowy plik kompilacji. My skupimy si\u0119 na plikach ELF dla architektury x86-64 (AMD64) uruchamianych na systemie Linux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Struktura pliku ELF<\/strong><\/h2>\n\n\n\n<p>Plik ELF zawiera:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nag\u0142\u00f3wek \u2013 wskazuje podstawowe informacje o pliku, takie jak: typ, architektura, rozmiar i lokalizacja tabeli program\u00f3w oraz sekcji.<\/li>\n\n\n\n<li>Program Header Table \u2013 opisuje, w jaki spos\u00f3b poszczeg\u00f3lne cz\u0119\u015bci pliku \u0142adowane s\u0105 do pami\u0119ci.<\/li>\n\n\n\n<li>Sekcje \u2013 r\u00f3\u017cne cz\u0119\u015bci pliku ELF, takie jak: kod wykonywalny, dane, symbole itp. Najwa\u017cniejsze sekcje to:\n<ul class=\"wp-block-list\">\n<li>.text \u2013 zawiera kod wykonywalny. Ta sekcja zostanie za\u0142adowana do pami\u0119ci z prawem do wykonania.<\/li>\n\n\n\n<li>.rodata \u2013 zawiera dane tylko do odczytu, np. \u0142a\u0144cuchy znak\u00f3w. Ta sekcja zostanie za\u0142adowana do pami\u0119ci z prawem tylko do odczytu.<\/li>\n\n\n\n<li>.data \u2013 zawiera dane do odczytu i zapisu. Tutaj znajduj\u0105 si\u0119 zainicjalizowane zmienne i zmienne globalne.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Section Header Table \u2013 szczeg\u00f3\u0142owo opisuje poszczeg\u00f3lne sekcje.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"330\" height=\"366\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image1-2.png\" alt=\"Struktura pliku ELF\" class=\"wp-image-33117\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image1-2.png 330w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image1-2-270x300.png 270w\" sizes=\"(max-width: 330px) 100vw, 330px\" \/><figcaption class=\"wp-element-caption\">Ryc. 1 Struktura pliku ELF<\/figcaption><\/figure>\n\n\n\n<p>Poszczeg\u00f3lne struktury zostan\u0105 dok\u0142adniej om\u00f3wione w dalszej cz\u0119\u015bci artyku\u0142u na przyk\u0142adach informacji zwracanych przez narz\u0119dzia do analizy plik\u00f3w ELF.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Narz\u0119dzia do pracy z plikami ELF<\/strong><\/h2>\n\n\n\n<p>W poni\u017cszych przyk\u0142adach wykorzystana zostanie aplikacja <code>app<\/code> skompilowana z kodu \u017ar\u00f3d\u0142owego znajduj\u0105cego si\u0119 w katalogu <code>app\/<\/code> projektu (patrz punkt: Zbudowanie projektu). Polecenia wykonywane by\u0142y z poziomu katalogu <code>build\/<\/code>, wi\u0119c <code>app\/app<\/code> odnosi si\u0119 do naszej testowej aplikacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>readelf \u2013 narz\u0119dzie do wy\u015bwietlania informacji o plikach ELF<\/strong><\/h3>\n\n\n\n<p><strong>Przyk\u0142ad wy\u015bwietlenia nag\u0142\u00f3wka ELF<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% readelf app\/app -h\nELF Header:\n  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00\n  Class:                             ELF64\n  Data:                              2&#039;s complement, little endian\n  Version:                           1 (current)\n  OS\/ABI:                            UNIX - System V\n  ABI Version:                       0\n  Type:                              EXEC (Executable file)\n  Machine:                           Advanced Micro Devices X86-64\n  Version:                           0x1\n  Entry point address:               0x4003a0\n  Start of program headers:          64 (bytes into file)\n  Start of section headers:          10880 (bytes into file)\n  Flags:                             0x0\n  Size of this header:               64 (bytes)\n  Size of program headers:           56 (bytes)\n  Number of program headers:         13\n  Size of section headers:           64 (bytes)\n  Number of section headers:         32\n  Section header string table index: 31\n\n<\/pre><\/div>\n\n\n<p>Przyjrzyjmy si\u0119 wy\u015bwietlonemu nag\u0142\u00f3wkowi, kt\u00f3ry zdefiniowany jest przez poni\u017csz\u0105 struktur\u0119 znajduj\u0105c\u0105 si\u0119 w kodzie \u017ar\u00f3d\u0142owym j\u0105dra Linuxa:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\ntypedef struct elf64_hdr {\n    unsigned char e_ident&#x5B;16];  \/* ELF &quot;magic number&quot; *\/\n    Elf64_Half e_type;\n    Elf64_Half e_machine;\n    Elf64_Word e_version;\n    Elf64_Addr e_entry; \/* Entry point virtual address *\/\n    Elf64_Off e_phoff;  \/* Program header table file offset *\/\n    Elf64_Off e_shoff;  \/* Section header table file offset *\/\n    Elf64_Word e_flags;\n    Elf64_Half e_ehsize;\n    Elf64_Half e_phentsize;\n    Elf64_Half e_phnum;\n    Elf64_Half e_shentsize;\n    Elf64_Half e_shnum;\n    Elf64_Half e_shstrndx;\n} Elf64_Ehdr;\n<\/pre><\/div>\n\n\n<p>Pole e_ident jest 16-bajtow\u0105 tablic\u0105 identyfikacyjn\u0105, kt\u00f3ra opisuje podstawowe cechy pliku ELF, jeszcze zanim parser pozna reszt\u0119 nag\u0142\u00f3wka.<\/p>\n\n\n\n<p>Struktura e_ident:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>e_ident<\/strong><\/td><td><strong>rozmiar<\/strong><\/td><\/tr><\/thead><tbody><tr><td>EI_MAG x7fELF<\/td><td>4 bajty<\/td><\/tr><tr><td>EI_CLASS<\/td><td>1 bajt<\/td><\/tr><tr><td>EI_DATA<\/td><td>1 bajt<\/td><\/tr><tr><td>EI_VERSION<\/td><td>1 bajt<\/td><\/tr><tr><td>EI_OSABI<\/td><td>1 bajt<\/td><\/tr><tr><td>EI_ABIVERSION<\/td><td>1 bajt<\/td><\/tr><tr><td>EI_PAD<\/td><td>7 bajt\u00f3w<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pierwsze 4 bajty (<code>0x7F 'E' 'L' 'F'<\/code>) jednoznacznie identyfikuj\u0105 plik jako ELF. Kolejne bajty okre\u015blaj\u0105 mi\u0119dzy innymi architektur\u0119 (32\/64), endianowo\u015b\u0107, ABI i jego wersj\u0119. Ostatnie 7 bajt\u00f3w to <code>EI_PAD<\/code> wype\u0142niony zerami dla sta\u0142ej d\u0142ugo\u015bci 16 bajt\u00f3w. Wykorzystamy je do umieszczenia znacznika infekcji w nag\u0142\u00f3wku pliku ELF.<\/p>\n\n\n\n<p>Inne wa\u017cne pola nag\u0142\u00f3wka to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Type \u2013 okre\u015bla typ pliku ELF (np. EXEC \u2013 pliki wykonywalne).<\/li>\n\n\n\n<li>Entry point \u2013 adres, pod kt\u00f3rym rozpoczyna si\u0119 wykonywanie programu.<\/li>\n\n\n\n<li>Start of program headers \u2013 offset w pliku ELF, pod kt\u00f3rym znajduje si\u0119 Program Header Table.<\/li>\n\n\n\n<li>Start of section headers \u2013 offset w pliku ELF, pod kt\u00f3rym znajduje si\u0119 Section Header Table.<\/li>\n<\/ul>\n\n\n\n<p><strong>Wy\u015bwietlenie tabeli nag\u0142\u00f3wk\u00f3w programu<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% readelf app\/app -lW\nElf file type is EXEC (Executable file)\nEntry point 0x4003a0\nThere are 13 program headers, starting at offset 64\n\nProgram Headers:\n  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n  PHDR           0x000040 0x0000000000400040 0x0000000000400040 0x0002d8 0x0002d8 R   0x8\n  INTERP         0x001000 0x0000000000401000 0x0000000000401000 0x00001c 0x00001c R   0x1\n      &#x5B;Requesting program interpreter: \/lib64\/ld-linux-x86-64.so.2]\n  LOAD           0x000000 0x0000000000400000 0x0000000000400000 0x0004cd 0x0004cd R E 0x1000\n  LOAD           0x001000 0x0000000000401000 0x0000000000401000 0x000468 0x000468 R   0x1000\n  LOAD           0x001dc8 0x0000000000402dc8 0x0000000000402dc8 0x000258 0x000390 RW  0x1000\n  DYNAMIC        0x001dd8 0x0000000000402dd8 0x0000000000402dd8 0x000200 0x000200 RW  0x8\n  NOTE           0x000318 0x0000000000400318 0x0000000000400318 0x000024 0x000024 R   0x4\n  NOTE           0x001408 0x0000000000401408 0x0000000000401408 0x000040 0x000040 R   0x8\n  NOTE           0x001448 0x0000000000401448 0x0000000000401448 0x000020 0x000020 R   0x4\n  GNU_PROPERTY   0x001408 0x0000000000401408 0x0000000000401408 0x000040 0x000040 R   0x8\n  GNU_EH_FRAME   0x00134c 0x000000000040134c 0x000000000040134c 0x00002c 0x00002c R   0x4\n  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10\n  GNU_RELRO      0x001dc8 0x0000000000402dc8 0x0000000000402dc8 0x000238 0x000238 R   0x1\n\n Section to Segment mapping:\n  Segment Sections...\n   00\n   01     .interp\n   02     .note.gnu.build-id .init .plt .text .fini\n   03     .interp .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .rodata .eh_frame_hdr .eh_frame .note.gnu.property .note.ABI-tag\n   04     .init_array .fini_array .dynamic .got .got.plt .data .bss\n   05     .dynamic\n   06     .note.gnu.build-id\n   07     .note.gnu.property\n   08     .note.ABI-tag\n   09     .note.gnu.property\n   10     .eh_frame_hdr\n   11\n   12     .init_array .fini_array .dynamic .got\n<\/pre><\/div>\n\n\n<p>Tabela nag\u0142\u00f3wk\u00f3w programu okre\u015bla, jak poszczeg\u00f3lne cz\u0119\u015bci pliku ELF s\u0105 mapowane na segmenty w pami\u0119ci. Kolejne wpisy informuj\u0105 kernel, w jaki spos\u00f3b dane z pliku ELF nale\u017cy umie\u015bci\u0107 w pami\u0119ci procesu. Przyk\u0142adowo pierwszy wiersz pokazuje, \u017ce nag\u0142\u00f3wek programu (<code>PHDR<\/code>) zaczyna si\u0119 od offsetu <code>0x000040<\/code> w pliku, ma rozmiar <code>0x0002d8<\/code> bajt\u00f3w i jest mapowany na adres wirtualny <code>0x0000000000400040<\/code>. Wpis jest oznaczony jako tylko do odczytu (R).<\/p>\n\n\n\n<p>Po za\u0142adowaniu tabeli nag\u0142\u00f3wk\u00f3w programu kernel mo\u017ce zdekodowa\u0107 kolejne struktury. Nast\u0119pny wpis wskazuje na interpreter programu, kt\u00f3ry ma zosta\u0107 u\u017cyty do za\u0142adowania bibliotek. Kolejne wpisy opisuj\u0105 segmenty \u0142adowane do pami\u0119ci (np. kod, dane). Warto te\u017c zwr\u00f3ci\u0107 uwag\u0119 na wyr\u00f3wnanie do rozmiaru strony (zwykle 4 KiB) \u2013 wykorzystamy t\u0119 w\u0142a\u015bciwo\u015b\u0107 do umieszczenia kodu wirusa. Jeden segment w pami\u0119ci mo\u017ce zawiera\u0107 jedn\u0105 lub wi\u0119cej sekcji pliku ELF.<\/p>\n\n\n\n<p><strong>Wy\u015bwietlenie tabeli nag\u0142\u00f3wk\u00f3w sekcji<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% readelf app\/app -SW\nThere are 32 section headers, starting at offset 0x2a80:\n\nSection Headers:\n  &#x5B;Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n  &#x5B; 0]                   NULL            0000000000000000 000000 000000 00      0   0  0\n  &#x5B; 1] .note.gnu.build-id NOTE            0000000000400318 000318 000024 00   A  0   0  4\n  &#x5B; 2] .init             PROGBITS        000000000040033c 00033c 00001b 00  AX  0   0  4\n  &#x5B; 3] .plt              PROGBITS        0000000000400360 000360 000040 10  AX  0   0 16\n  &#x5B; 4] .text             PROGBITS        00000000004003a0 0003a0 00011e 00  AX  0   0 16\n  &#x5B; 5] .fini             PROGBITS        00000000004004c0 0004c0 00000d 00  AX  0   0  4\n  &#x5B; 6] .interp           PROGBITS        0000000000401000 001000 00001c 00   A  0   0  1\n  &#x5B; 7] .gnu.hash         GNU_HASH        0000000000401020 001020 000028 00   A  8   0  8\n  &#x5B; 8] .dynsym           DYNSYM          0000000000401048 001048 0000c0 18   A  9   1  8\n  &#x5B; 9] .dynstr           STRTAB          0000000000401108 001108 000124 00   A  0   0  1\n  &#x5B;10] .gnu.version      VERSYM          000000000040122c 00122c 000010 02   A  8   0  2\n  &#x5B;11] .gnu.version_r    VERNEED         0000000000401240 001240 000050 00   A  9   2  8\n  &#x5B;12] .rela.dyn         RELA            0000000000401290 001290 000048 18   A  8   0  8\n  &#x5B;13] .rela.plt         RELA            00000000004012d8 0012d8 000048 18  AI  8  23  8\n  &#x5B;14] .rodata           PROGBITS        0000000000401320 001320 000029 00   A  0   0  8\n  &#x5B;15] .eh_frame_hdr     PROGBITS        000000000040134c 00134c 00002c 00   A  0   0  4\n  &#x5B;16] .eh_frame         PROGBITS        0000000000401378 001378 00008c 00   A  0   0  8\n  &#x5B;17] .note.gnu.property NOTE            0000000000401408 001408 000040 00   A  0   0  8\n  &#x5B;18] .note.ABI-tag     NOTE            0000000000401448 001448 000020 00   A  0   0  4\n  &#x5B;19] .init_array       INIT_ARRAY      0000000000402dc8 001dc8 000008 08  WA  0   0  8\n  &#x5B;20] .fini_array       FINI_ARRAY      0000000000402dd0 001dd0 000008 08  WA  0   0  8\n  &#x5B;21] .dynamic          DYNAMIC         0000000000402dd8 001dd8 000200 10  WA  9   0  8\n  &#x5B;22] .got              PROGBITS        0000000000402fd8 001fd8 000010 08  WA  0   0  8\n  &#x5B;23] .got.plt          PROGBITS        0000000000402fe8 001fe8 000030 08  WA  0   0  8\n  &#x5B;24] .data             PROGBITS        0000000000403018 002018 000008 00  WA  0   0  4\n  &#x5B;25] .bss              NOBITS          0000000000403040 002020 000118 00  WA  0   0 64\n  &#x5B;26] .comment          PROGBITS        0000000000000000 002020 00005c 01  MS  0   0  1\n  &#x5B;27] .annobin.notes    PROGBITS        0000000000000000 00207c 00014f 01  MS  0   0  1\n  &#x5B;28] .gnu.build.attributes NOTE            0000000000405158 0021cc 000144 00      0   0  4\n  &#x5B;29] .symtab           SYMTAB          0000000000000000 002310 0003a8 18     30  18  8\n  &#x5B;30] .strtab           STRTAB          0000000000000000 0026b8 000288 00      0   0  1\n  &#x5B;31] .shstrtab         STRTAB          0000000000000000 002940 00013b 00      0   0  1\nKey to Flags:\n  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n  L (link order), O (extra OS processing required), G (group), T (TLS),\n  C (compressed), x (unknown), o (OS specific), E (exclude),\n  D (mbind), l (large), p (processor specific)\n<\/pre><\/div>\n\n\n<p>Tabela nag\u0142\u00f3wk\u00f3w sekcji szczeg\u00f3\u0142owo opisuje poszczeg\u00f3lne sekcje pliku ELF zapisanego na dysku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>objdump \u2013 narz\u0119dzie do analizy i deasemblacji plik\u00f3w ELF<\/strong><\/h3>\n\n\n\n<p><strong>Przyk\u0142ad deasemblacji sekcji .text:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% objdump -M intel -d -j .text app\/app\napp\/app:     file format elf64-x86-64\nDisassembly of section .text:\n\n00000000004003a0 &lt;_start&gt;:\n  4003a0:       f3 0f 1e fa             endbr64\n  4003a4:       31 ed                   xor    ebp,ebp\n  4003a6:       49 89 d1                mov    r9,rdx\n  4003a9:       5e                      pop    rsi\n  4003aa:       48 89 e2                mov    rdx,rsp\n  4003ad:       48 83 e4 f0             and    rsp,0xfffffffffffffff0\n  4003b1:       50                      push   rax\n  4003b2:       54                      push   rsp\n  4003b3:       45 31 c0                xor    r8d,r8d\n  4003b6:       31 c9                   xor    ecx,ecx\n  4003b8:       48 c7 c7 86 04 40 00    mov    rdi,0x400486\n  4003bf:       ff 15 13 2c 00 00       call   QWORD PTR &#x5B;rip+0x2c13]        # 402fd8 &lt;__libc_start_main@GLIBC_2.34&gt;\n  4003c5:       f4                      hlt\n.\n.\n.\n<\/pre><\/div>\n\n\n<p>Pierwsza kolumna to offset, kt\u00f3rego interpretacja mo\u017ce by\u0107 r\u00f3\u017cna w zale\u017cno\u015bci od tego, czy patrzymy na program skompilowany jako PIE (Position Independent Executable), czy nie. Druga kolumna to kod maszynowy, kt\u00f3ry jest wykonywany przez procesor. Trzecia to dezasemblacja kodu maszynowego na instrukcje asemblera w sk\u0142adni Intel.<\/p>\n\n\n\n<p><strong>Odczyt sekcji .rodata:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% objdump -d -j .rodata app\/app\napp\/app:     file format elf64-x86-64\n\nDisassembly of section .rodata:\n\n0000000000401320 &lt;_IO_stdin_used&gt;:\n  401320:       01 00 02 00 00 00 00 00                             ........\n\n0000000000401328 &lt;__dso_handle&gt;:\n        ...\n  401330:       48 65 6c 6c 6f 2c 20 49 20 61 6d 20 4c 69 6e 75     Hello, I am Linu\n  401340:       78 27 73 20 45 4c 46 21 00                          x&#039;s ELF!.\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Co si\u0119 dzieje przed wywo\u0142aniem main()<\/strong><\/h3>\n\n\n\n<p>W nag\u0142\u00f3wku ELF znajduje si\u0119 <code>entry point<\/code>, czyli adres, od kt\u00f3rego zaczyna si\u0119 wykonywanie programu. Ale co jest pierwsz\u0105 wykonywan\u0105 instrukcj\u0105?<\/p>\n\n\n\n<p>Pierwsza instrukcja pochodzi zazwyczaj z pliku obiektowego <code>crt0.o<\/code>. W pliku tym znajduje si\u0119 funkcja <code>_<a>start(<\/a>)<\/code>, kt\u00f3ra przygotowuje \u015brodowisko dla programu i wywo\u0142uje funkcj\u0119 <code>main()<\/code>. Wszystkie programy napisane w C domy\u015blnie s\u0105 linkowe z crt0.o, chyba \u017ce zostanie u\u017cyta opcja <code>nostartfiles<\/code>. Skorzystamy z niej w trakcie kompilacji naszego wirusa.<\/p>\n\n\n\n<p>W kodzie kernela mo\u017cna znale\u017a\u0107 funkcj\u0119 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/fs\/binfmt_elf.c#L832\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >load_elf_binary()<\/a> s\u0142u\u017c\u0105c\u0105 do \u0142adowania plik\u00f3w ELF, kt\u00f3ra korzysta z tych informacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Goblin<\/strong><\/h2>\n\n\n\n<p>Nasz demonstracyjny wirus, tak jak goblin, jest ca\u0142kiem niegro\u017any, wy\u015bwietla jedynie informacj\u0119, \u017ce jego kod zosta\u0142 wstrzykni\u0119ty i uruchomiony w ramach zmodyfikowanego pliku wykonywalnego ELF.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Budowa wirusa<\/strong><\/h3>\n\n\n\n<p>Wirus nale\u017cy skompilowa\u0107 jako PIE (Position Independent Executable), czyli musi by\u0107 niezale\u017cny od adresu bazowego w pami\u0119ci. Oznacza to, \u017ce wszystkie odwo\u0142ania do adres\u00f3w musz\u0105 by\u0107 wzgl\u0119dne, by umo\u017cliwi\u0107 za\u0142adowanie wirusa w dowolnym miejscu w pami\u0119ci.<\/p>\n\n\n\n<p>Wirus musi by\u0107 r\u00f3wnie\u017c samowystarczalny, co oznacza, \u017ce nie mo\u017ce zale\u017ce\u0107 od zewn\u0119trznych bibliotek ani zasob\u00f3w. Przyk\u0142adowo, nie mo\u017ce u\u017cywa\u0107 funkcji <code>printf()<\/code> ze standardowej biblioteki C. Chodzi o to, \u017ce bardzo trudno jest z poziomu wirusa zlokalizowa\u0107 funkcje z zewn\u0119trznych bibliotek, kt\u00f3re s\u0105 dynamicznie \u0142adowane.<\/p>\n\n\n\n<p>Chcemy, aby kod wirusa mo\u017cna by\u0142o wyci\u0105\u0107 jako jeden ca\u0142y blok binarny daj\u0105cy si\u0119 wstrzykn\u0105\u0107 do zainfekowanego programu. Zazwyczaj instrukcje wirusa s\u0105 wykonywane przed kodem zainfekowanego programu. Nie chcemy dwukrotnie wykonywa\u0107 kodu startowego biblioteki C. Dlatego musimy sami przygotowa\u0107 \u015brodowisko do wywo\u0142ania funkcji <code>main()<\/code> wirusa, nast\u0119pnie przywr\u00f3ci\u0107 stan rejestr\u00f3w i przekierowa\u0107 wykonanie do oryginalnych instrukcji zainfekowanego programu. Sprowadza si\u0119 to do przygotowania w\u0142asnego kodu startowego oraz skryptu linkera, aby posk\u0142ada\u0107 wszystko w odpowiedni spos\u00f3b.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"794\" height=\"680\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image2-1.png\" alt=\"Wstrzykiwanie wirusa\" class=\"wp-image-33119\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image2-1.png 794w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image2-1-300x257.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/image2-1-768x658.png 768w\" sizes=\"(max-width: 794px) 100vw, 794px\" \/><figcaption class=\"wp-element-caption\">Ryc. 2 Wstrzykiwanie wirusa<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Kod startowy<\/strong><\/h3>\n\n\n\n<p>Najwa\u017cniejsze cz\u0119\u015bci tego kodu to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Przygotowanie stosu przed wywo\u0142aniem funkcji <code>main()<\/code> wirusa.<\/li>\n\n\n\n<li>Przywr\u00f3cenie stanu rejestr\u00f3w po zako\u0144czeniu dzia\u0142ania wirusa.<\/li>\n\n\n\n<li>Przekierowanie wykonania do oryginalnego punktu wej\u015bcia zainfekowanego programu, zrealizowane poprzez skok do odpowiedniego adresu w pami\u0119ci obliczonego podczas infekcji. Miejsce na wstawienie instrukcji skoku wyznaczaj\u0105 puste instrukcje <code>nop<\/code> na ko\u0144cu kodu startowego.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n.section .text.start_parasite\n.global _start\n_start:\n\npush %rax\npush %rbx\npush %rcx\npush %rdx\npush %rbp\npush %rsi\npush %rdi\npush %r8\npush %r9\npush %rsp\ncall main\npop %rsp\npop %r9\npop %r8\npop %rdi\npop %rsi\npop %rbp\npop %rdx\npop %rcx\npop %rbx\npop %rax\n\/* offset from _start is 29\n  must be aligned with parasite_entry_jmp_offset inside Infector class *\/\n.global _patch_return\n_patch_return:\n\/*\n  place a jump instruction here to redirect execution to the original entry point\n*\/\nnop\nnop\nnop\nnop\nnop\nhlt\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Kod g\u0142\u00f3wny wirusa<\/strong><\/h3>\n\n\n\n<p>Nasz demonstracyjny wirus ma za zadanie jedynie wy\u015bwietlenie komunikatu na standardowym wyj\u015bciu. Ju\u017c na pierwszy rzut oka wida\u0107, \u017ce r\u00f3\u017cni si\u0119 on od tradycyjnego \u201eHello, World!\u201d w C. Jest to spowodowane ograniczeniami opisanymi powy\u017cej.<\/p>\n\n\n\n<p>Po pierwsze nie mo\u017cemy u\u017cy\u0107 funkcji <code>printf()<\/code> z biblioteki standardowej C, poniewa\u017c nie mo\u017cemy polega\u0107 na zewn\u0119trznych bibliotekach. Musimy u\u017cy\u0107 bezpo\u015brednich wywo\u0142a\u0144 systemowych do komunikacji z j\u0105drem. Tablica znakowa jest zdefiniowana i zainicjalizowana w taki spos\u00f3b, aby \u0142a\u0144cuch znakowy nie zosta\u0142 umieszczony w sekcji danych. Ca\u0142o\u015b\u0107 umieszczona jest w sekcji <code>.text<\/code> dla \u0142atwiejszej ekstrakcji ca\u0142ego wirusa.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &quot;helpers\/sys.h&quot;\n\nint main() {\n\n  char str&#x5B;21] = {0};\n  str&#x5B;0] = &#039;H&#039;; str&#x5B;1] = &#039;e&#039;; str&#x5B;2] = &#039;l&#039;; str&#x5B;3] = &#039;l&#039;; \n  str&#x5B;4] = &#039;o&#039;; str&#x5B;5] = &#039;,&#039;; str&#x5B;6] = &#039; &#039;; str&#x5B;7] = &#039;I&#039;; \n  str&#x5B;8] = &#039; &#039;; str&#x5B;9] = &#039;a&#039;; str&#x5B;10] = &#039;m&#039;; str&#x5B;11] = &#039; &#039;;\n  str&#x5B;12] = &#039;G&#039;; str&#x5B;13] = &#039;o&#039;; str&#x5B;14] = &#039;b&#039;; str&#x5B;15] = &#039;l&#039;; \n  str&#x5B;16] = &#039;i&#039;; str&#x5B;17] = &#039;n&#039;; str&#x5B;18] = &#039;!&#039;; str&#x5B;19] = &#039;\\n&#039;; \n  str&#x5B;20] = &#039;\\0&#039;;\n\n  write(1, str, strlen(str));\n\n  return 0;\n}\n<\/pre><\/div>\n\n\n<p>Aby ca\u0142o\u015b\u0107 mog\u0142a zadzia\u0142a\u0107, potrzebny jest odpowiedni skrypt linkera oraz kompilacja z odpowiednimi flagami, z kt\u00f3rych najwa\u017cniejsze to te m\u00f3wi\u0105ce o konieczno\u015bci kompilacji jako PIE oraz o braku domy\u015blnych plik\u00f3w startowych.<\/p>\n\n\n\n<p>Szczeg\u00f3\u0142y znajduj\u0105 si\u0119 w pliku <code>test_virus\/CMakeLists.txt<\/code> projektu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wyci\u0119cie kodu wirusa<\/strong><\/h3>\n\n\n\n<p>Skorzystajmy z narz\u0119dzia <code>objcopy<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% objcopy -j .text -O binary test_virus\/test_virus extracted\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142adowa aplikacja wykorzystywana do infekcji<\/strong><\/h3>\n\n\n\n<p>Aplikacja to typowy program \u201eHello, World!\u201d w C++, skompilowany w standardowy spos\u00f3b.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;iostream&gt;\n\nint gint = -1;\n\nint main(int argc, char **argv)\n{\n  std::cout &lt;&lt; &quot;Hello, I am Linux&#039;s ELF!&quot; &lt;&lt; std::endl;\n\n  return (gint + argc);\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Program infekuj\u0105cy<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Technika infekcji \u2013 Text Injection<\/strong><\/h3>\n\n\n\n<p>Program infekuj\u0105cy modyfikuje plik ELF w celu wstrzykni\u0119cia kodu wirusa. Proces ten obejmuje analiz\u0119 struktury pliku ELF, znalezienie odpowiedniego miejsca na wstrzykni\u0119cie kodu oraz aktualizacj\u0119 struktur pliku, aby uwzgl\u0119dni\u0107 nowy kod.<\/p>\n\n\n\n<p>Technika ta jest znana jako <code>text injection<\/code>, poniewa\u017c kod wirusa jest wstrzykiwany do segmentu zawieraj\u0105cego kod wykonywalny (<code>.text<\/code>). Jest to jedna z prostszych technik infekcji plik\u00f3w ELF, poniewa\u017c nie wymaga dodawania nowych sekcji ani segment\u00f3w. Jej ograniczeniem jest konieczno\u015b\u0107 znalezienia wystarczaj\u0105co du\u017cej przestrzeni w istniej\u0105cym segmencie kodu, aby pomie\u015bci\u0107 kod wirusa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Implementacja programu infekuj\u0105cego<\/strong><\/h3>\n\n\n\n<p>Klasa <code>Infector<\/code>, odpowiada za:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wykrywanie mo\u017cliwo\u015bci infekcji:\n<ul class=\"wp-block-list\">\n<li>Sprawdzenie rozmiaru pliku (musi by\u0107 wi\u0119kszy ni\u017c minimalny rozmiar).<\/li>\n\n\n\n<li>Sprawdzenie pierwszych 4 bajt\u00f3w pliku (0x7F \u2018E\u2019 \u2018L\u2019 \u2018F\u2019).<\/li>\n\n\n\n<li>Sprawdzenie, czy plik jest ju\u017c zainfekowany, aby nie infekowa\u0107 go kolejny raz. Znacznik infekcji VIR jest umieszczony w tablicy <code>&amp;ehdr-&gt;e_ident[EI_PAD]<\/code> w nag\u0142\u00f3wku ELF (podrozdzia\u0142: readelf). Wykorzystali\u015bmy fakt, \u017ce te 7 bajt\u00f3w jest zawsze wype\u0142nione zerami w standardowych plikach ELF. Narz\u0119dzie xxd pozwala zobrazowa\u0107 zawarto\u015b\u0107 tablicy e_ident przyk\u0142adowego zainfekowanego pliku: <br><code>% xxd infected_binary<br>00000000: 7f45 4c46 0201 0100 0056 4952 0000 <a>0000&nbsp; .ELF.....<\/a>VIR....<\/code><\/li>\n\n\n\n<li>Walidacja typu pliku (tylko pliki wykonywalne).<\/li>\n\n\n\n<li>Weryfikacja architektury (x86-64).<\/li>\n\n\n\n<li>Znalezienie odpowiedniego miejsca na wstrzykni\u0119cie kodu, kt\u00f3re jest wystarczaj\u0105co du\u017ce, aby pomie\u015bci\u0107 kod wirusa.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Przeprowadzenie procesu infekcji:\n<ul class=\"wp-block-list\">\n<li>Umieszczenie znacznika infekcji w nag\u0142\u00f3wku ELF.<\/li>\n\n\n\n<li>Przekopiowanie kodu wirusa do znalezionego miejsca.<\/li>\n\n\n\n<li>Aktualizacja nag\u0142\u00f3wk\u00f3w programu i sekcji, aby uwzgl\u0119dni\u0107 nowy kod.<\/li>\n\n\n\n<li>Modyfikacja instrukcji skoku w kodzie startowym wirusa, aby przekierowa\u0107 wykonanie do oryginalnego punktu wej\u015bcia programu.<\/li>\n\n\n\n<li>Modyfikacja punktu wej\u015bcia programu, aby wskazywa\u0142 na kod wirusa.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zbudowanie projektu<\/strong><\/h2>\n\n\n\n<p>Aby zbudowa\u0107 projekt, nale\u017cy wykona\u0107 nast\u0119puj\u0105ce kroki w katalogu g\u0142\u00f3wnym projektu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% mkdir build\n% cd build\n% cmake ..\n% make\n<\/pre><\/div>\n\n\n<p>Spowoduje to zbudowanie aplikacji, wirusa oraz programu infekuj\u0105cego. Zostanie przeprowadzony proces infekcji i uruchomienie zainfekowanego pliku wykonywalnego.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n&#x5B; 12%] Building CXX object infector\/CMakeFiles\/infector.dir\/infector.cpp.o\n&#x5B; 25%] Building CXX object infector\/CMakeFiles\/infector.dir\/main.cpp.o\n&#x5B; 37%] Linking CXX executable infector\n&#x5B; 37%] Built target infector\n&#x5B; 50%] Building ASM object test_virus\/CMakeFiles\/test_virus.dir\/startup_x86_64.S.o\n&#x5B; 62%] Building CXX object test_virus\/CMakeFiles\/test_virus.dir\/test_virus.cpp.o\n&#x5B; 75%] Linking CXX executable test_virus\n&#x5B; 75%] Built target test_virus\n&#x5B; 87%] Building CXX object app\/CMakeFiles\/app.dir\/app.cpp.o\n&#x5B;100%] Linking CXX executable app\n&#x5B;100%] Built target app\n---------------------------------------------------\nExtracting binary from test_virus, running infector and executing infected binary\nShould be visible print from test_virus and app\n---------------------------------------------------\nHello, I am Goblin!\nHello, I am Linux&#039;s ELF!\n&#x5B;100%] Built target run_test_virus\n<\/pre><\/div>\n\n\n<p>Infektora mo\u017cna u\u017cy\u0107 do infekcji dowolnego pliku ELF x86-64 na systemie Linux, pod warunkiem, \u017ce spe\u0142nia on kryteria opisane w dokumencie.<\/p>\n\n\n\n<p><strong>Pami\u0119taj jednak<\/strong>, \u017ce modyfikowanie plik\u00f3w wykonywalnych mo\u017ce <strong>narusza\u0107 zasady licencyjne<\/strong> oprogramowania oraz<strong> stanowi\u0107 zagro\u017cenie bezpiecze\u0144stwa<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n% .\/infector\/infector \/usr\/bin\/ls extracted infected_ls\n% chmod +x infected_ls\n% .\/infected_ls\nHello, I am Goblin!\napp  CMakeCache.txt  CMakeFiles  cmake_install.cmake  extracted  infected_binary  infected_ls  infector  Makefile  test_virus\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/praca-m-2.jpg\" alt=\"oferty pracy\" class=\"wp-image-33121\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/praca-m-2.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/praca-m-2-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Artyku\u0142 przedstawia analiz\u0119 plik\u00f3w ELF w celu zrozumienia ich struktury. Praktyczne zastosowanie tej wiedzy zosta\u0142o zilustrowane poprzez stworzenie prostego wirusa ELF i programu infekuj\u0105cego. Wykorzystano do tego technik\u0119 text injection, kt\u00f3rej ograniczeniem jest mo\u017cliwo\u015b\u0107 wstrzykni\u0119cia relatywnie niewielkiego kodu.<\/p>\n\n\n\n<p>W rzeczywisto\u015bci istnieje wiele bardziej zaawansowanych technik infekcji plik\u00f3w ELF, kt\u00f3re pozwalaj\u0105 na wi\u0119ksz\u0105 elastyczno\u015b\u0107 i skuteczno\u015b\u0107, ale s\u0105 te\u017c bardziej skomplikowane w implementacji. Prawdziwe wirusy zdolne s\u0105 do samoreplikacji, co wymaga dodatkowych mechanizm\u00f3w do kopiowania swojego kodu do innych plik\u00f3w wykonywalnych. Zwi\u0119ksza to zar\u00f3wno z\u0142o\u017cono\u015b\u0107 implementacji jak i wielo\u015b\u0107 kodu potrzebnego do realizacji takiego zadania.<\/p>\n\n\n\n<p>Zach\u0119cam Was do zapoznania si\u0119 z kodem \u017ar\u00f3d\u0142owym zar\u00f3wno wirusa, jak i programu infekuj\u0105cego, aby lepiej zrozumie\u0107 szczeg\u00f3\u0142y implementacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pliki<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-c693aafe-e436-4471-b417-ff01535deafb\" href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/all_files_download.zip\">ELFy i Gobliny &#8211; pliki<\/a><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/all_files_download.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-c693aafe-e436-4471-b417-ff01535deafb\">Pobierz<\/a><\/div>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;33116&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;ELFy i Gobliny Linuxa&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Tematem artyku\u0142u jest analiza binarna plik\u00f3w ELF (skr\u00f3t od Executable and Linkable Format) i zrozumienie ich struktury. We wpisie przedstawi\u0119 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/elfy-i-gobliny-linuxa\/\">Continued<\/a><\/p>\n","protected":false},"author":775,"featured_media":33123,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[6861,1512,563,155],"class_list":["post-33116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-elf","tag-poradnik","tag-embedded","tag-linux"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/02\/Coding_5.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/33116"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/775"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=33116"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/33116\/revisions"}],"predecessor-version":[{"id":33160,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/33116\/revisions\/33160"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/33123"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=33116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=33116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=33116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}