
рд░реВрд╕реА рдореЗрдВ, рдПрд▓рдПрд▓рдПрдл рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ (рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк - рд▓рд┐рдирдХреНрд╕ рдФрд░ рдХрдИ рдпреВрдирд┐рдХреНрд╕ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░рд╛рд░реВрдк)ред рд╣рдо рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрджрд░реНрдн рдкреБрд╕реНрддрдХ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред
рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░ рдкрд╛рдардХ рдИрдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ (рдЕрдиреНрдпрдерд╛, рд╣рдо рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк 101 рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ)ред
рдХрдЯ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдореЗрдЯрд╛-рд╕реВрдЪрдирд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреЛрдВ, рд╕рдВрд╢реЛрдзрди, рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкреНрд░рдЬрдирди рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ред
"рдореИрдВ рднреА рдПрдХ рдпреЛрдЧрд┐рдиреА рд╣реВрдБ ... рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдиреАрд▓рд╛ ... рдмрд╣реБрдд рд▓рд╛рд▓ рд░реЛрдЧреА рд╣реИрдВ ... рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдиреАрд▓рд╛ ... рдФрд░ рд╣рдо рд▓рд╛рд▓ рд╣реИрдВ ... рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдиреАрд▓рд╛ ... рдЬрд╛рджреВ рд╕реЗ рдХреЗрд╡рд▓ рдкрд░реЗрд╢рд╛рдирд┐рдпрд╛рдБ рд╣реИрдВ ...
(c) рдмреЗрди рдФрд░ рд╣реЛрд▓реА рдХреЗ рд▓рд┐рдЯрд┐рд▓ рдХрд┐рдВрдЧрдбрдо
рдЙрдкрдХрд░рдг
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рджреЛрдиреЛрдВ рдкрд░ рдЪрд▓рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡реНрдпрдВрдЬрдиреЛрдВ рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
- рдмрд┐рдиреНрдпреВрдЯрд┐рд▓реНрд╕ рд╕реЗрдЯ (objcopy, objdump, readelf, strip) рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ;
- radare2 рдврд╛рдВрдЪрд╛ ;
- рдлрд╝рд╛рдЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ (рдЙрджрд╛рд╣рд░рдг 010Editor рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд░реА рд╡реЗрд▓реЗрд╕ );
- рдкрд╛рдпрдерди рдФрд░ LIEF рдкреБрд╕реНрддрдХрд╛рд▓рдп;
- рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (рд▓рд┐рдВрдХ рдиреБрд╕реНрдЦрд╛ рдореЗрдВ рд╣реИрдВ)ред
рдЯреЗрд╕реНрдЯ рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ
"рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ" рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕рд░рд▓ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░реИрдХрдореНрд╕ рдкрд░ рдкреЙрдХреЗрдореНрд╕ рдХреЗ рдкреАрдЖрдИрдЖрдИрдПрд╕рдПрдорд╡рд╛рдИрдПрдлрдПрд╡реА рдХрд╛рд░реНрдп рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди "рдПрд▓рд╡реЗрди" рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реА рдереА, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЧрд┐рдиреА рдмрдирд╛рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рджреА рдЬрд╛рдПрдЧреАред
рд▓рд┐рдВрдХ рдкрд░ рдореБрдлреНрдд рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ рднреА рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░, рд╢реАрд░реНрд╖рдХ, рдЕрдиреБрднрд╛рдЧ
рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреНрдпрд╛рдЬ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ:
- рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ (рдбрд╛рдпрди - рдкреБрд╕реНрддрдХрд╛рд▓рдп, EXEC - рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп, RELOC - рд▓рд┐рдВрдХреЗрдмрд▓);
- рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ (E_MACHINE - x86_64, x86, ARM, рдЖрджрд┐);
- рдЖрд╡реЗрджрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ (рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ);
- рдЕрдиреБрднрд╛рдЧ рдХреА рдЬрд╛рдирдХрд╛рд░реАред
010Editor
HEX рд╕рдВрдкрд╛рджрдХ 010Editor рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред ELF рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, ELF.bt рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╢реНрд░реЗрдгреА (рдореЗрдиреВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ - рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп) рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ (рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ) (рдлрд╝рд╛рдЗрд▓ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рджрд░реНрдЬ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

readelf
рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдкрдврд╝реЗрдВ:
$ readelf -h simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x1070 Start of program headers: 64 (bytes into file) Start of section headers: 14800 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 11 Size of section headers: 64 (bytes) Number of section headers: 30 Section header string table index: 29
- рдЦрдВрдбреЛрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВ:
$ readelf -l -W simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдордкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдкрддреЗ 32-рдмрд┐рдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:
Elf file type is DYN (Shared object file) Entry point 0x1070 There are 11 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000040 0x00000040 0x00000040 0x000268 0x000268 R 0x8 INTERP 0x0002a8 0x000002a8 0x000002a8 0x00001c 0x00001c R 0x1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] LOAD 0x000000 0x00000000 0x00000000 0x0005f8 0x0005f8 R 0x1000 LOAD 0x001000 0x00001000 0x00001000 0x00026d 0x00026d RE 0x1000 LOAD 0x002000 0x00002000 0x00002000 0x0001b8 0x0001b8 R 0x1000 LOAD 0x002de8 0x00003de8 0x00003de8 0x000258 0x000260 RW 0x1000 DYNAMIC 0x002df8 0x00003df8 0x00003df8 0x0001e0 0x0001e0 RW 0x8 NOTE 0x0002c4 0x000002c4 0x000002c4 0x000044 0x000044 R 0x4 GNU_EH_FRAME 0x002070 0x00002070 0x00002070 0x00003c 0x00003c R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x000000 0x000000 RW 0x10 GNU_RELRO 0x002de8 0x00003de8 0x00003de8 0x000218 0x000218 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 03 .init .plt .plt.got .text .fini 04 .rodata .eh_frame_hdr .eh_frame 05 .init_array .fini_array .dynamic .got .got.plt .data .bss 06 .dynamic 07 .note.ABI-tag .note.gnu.build-id 08 .eh_frame_hdr 09 10 .init_array .fini_array .dynamic .got
- рдЕрдиреБрднрд╛рдЧ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВ:
$ readelf -S -W simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдордкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдкрддреЗ 32-рдмрд┐рдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:
There are 30 section headers, starting at offset 0x39d0: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 000002a8 0002a8 00001c 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 000002c4 0002c4 000020 00 A 0 0 4 [ 3] .note.gnu.build-id NOTE 000002e4 0002e4 000024 00 A 0 0 4 [ 4] .gnu.hash GNU_HASH 00000308 000308 000024 00 A 5 0 8 [ 5] .dynsym DYNSYM 00000330 000330 0000d8 18 A 6 1 8 [ 6] .dynstr STRTAB 00000408 000408 0000a2 00 A 0 0 1 [ 7] .gnu.version VERSYM 000004aa 0004aa 000012 02 A 5 0 2 [ 8] .gnu.version_r VERNEED 000004c0 0004c0 000030 00 A 6 1 8 [ 9] .rela.dyn RELA 000004f0 0004f0 0000c0 18 A 5 0 8 [10] .rela.plt RELA 000005b0 0005b0 000048 18 AI 5 23 8 [11] .init PROGBITS 00001000 001000 000017 00 AX 0 0 4 [12] .plt PROGBITS 00001020 001020 000040 10 AX 0 0 16 [13] .plt.got PROGBITS 00001060 001060 000008 08 AX 0 0 8 [14] .text PROGBITS 00001070 001070 0001f2 00 AX 0 0 16 [15] .fini PROGBITS 00001264 001264 000009 00 AX 0 0 4 [16] .rodata PROGBITS 00002000 002000 000070 00 A 0 0 8 [17] .eh_frame_hdr PROGBITS 00002070 002070 00003c 00 A 0 0 4 [18] .eh_frame PROGBITS 000020b0 0020b0 000108 00 A 0 0 8 [19] .init_array INIT_ARRAY 00003de8 002de8 000008 08 WA 0 0 8 [20] .fini_array FINI_ARRAY 00003df0 002df0 000008 08 WA 0 0 8 [21] .dynamic DYNAMIC 00003df8 002df8 0001e0 10 WA 6 0 8 [22] .got PROGBITS 00003fd8 002fd8 000028 08 WA 0 0 8 [23] .got.plt PROGBITS 00004000 003000 000030 08 WA 0 0 8 [24] .data PROGBITS 00004030 003030 000010 00 WA 0 0 8 [25] .bss NOBITS 00004040 003040 000008 00 WA 0 0 1 [26] .comment PROGBITS 00000000 003040 00001c 01 MS 0 0 1 [27] .symtab SYMTAB 00000000 003060 000630 18 28 44 8 [28] .strtab STRTAB 00000000 003690 000232 00 0 0 1 [29] .shstrtab STRTAB 00000000 0038c2 000107 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific)
- рдкрдврд╝реЗрдВ рдкреНрд░рддреАрдХ рд╕реВрдЪрдирд╛:
$ readelf -s -W simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдордЖрдЙрдЯрдкреБрдЯ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИ:
Symbol table '.dynsym' contains 9 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 2: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2) 3: 00000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2) 4: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 5: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 6: 00000000 0 FUNC GLOBAL DEFAULT UND __isoc99_scanf@GLIBC_2.7 (3) 7: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 8: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2) Symbol table '.symtab' contains 66 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 000002a8 0 SECTION LOCAL DEFAULT 1 2: 000002c4 0 SECTION LOCAL DEFAULT 2 3: 000002e4 0 SECTION LOCAL DEFAULT 3 4: 00000308 0 SECTION LOCAL DEFAULT 4 5: 00000330 0 SECTION LOCAL DEFAULT 5 6: 00000408 0 SECTION LOCAL DEFAULT 6 7: 000004aa 0 SECTION LOCAL DEFAULT 7 .... 26: 00000000 0 SECTION LOCAL DEFAULT 26 27: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 28: 000010a0 0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 29: 000010d0 0 FUNC LOCAL DEFAULT 14 register_tm_clones 30: 00001110 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 31: 00004040 1 OBJECT LOCAL DEFAULT 25 completed.7389 ....
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ, 80 рд╡рд░реНрдг) рдХреА рдЪреМрдбрд╝рд╛рдИ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП -W
рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд░рд╛рд╣рдд
рдЖрдк рдкрд╛рдпрдерди рдХреЛрдб рдФрд░ LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрдбрд░ рдФрд░ рд╕реЗрдХреНрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ):
import lief binary = lief.parse("simple.elf") header = binary.header print("Entry point: %08x" % header.entrypoint) print("Architecture: ", header.machine_type) for section in binary.sections: print("Section %s - size: %s bytes" % (section.name, section.size)
рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдмрд┐рд▓реНрдб рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, .comment
рдФрд░ .note
ред
objdump
$ objdump -s --section .comment simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо simple: file format elf64-x86-64 Contents of section .comment: 0000 4743433a 20284465 6269616e 20382e32 GCC: (Debian 8.2 0010 2e302d39 2920382e 322e3000 .0-9) 8.2.0.
readelf
$ readelf -p .comment simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо String dump of section '.comment': [ 0] GCC: (Debian 8.2.0-9) 8.2.0
$ readelf -n simple
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо Displaying notes found at file offset 0x000002c4 with length 0x00000020: Owner Data size Description GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) OS: Linux, ABI: 3.2.0 Displaying notes found at file offset 0x000002e4 with length 0x00000024: Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: dae0509e4edb79719a65af37962b74e4cf2a8c2e
рд░рд╛рд╣рдд
import lief binary = lief.parse("simple") comment = binary.get_section(".comment") print("Comment: ", bytes(comment.content))
рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХрд░реВрдБрдЧрд╛ ... RPATH
рдХрд▓реНрдкрд┐рдд рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрд┐рдд рдкрде рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рд╡реЗрд░рд┐рдПрдмрд▓ LD_LIBRARY_PATH
рдХреЛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЗрд╕ рдкрде рдХреЛ ELF рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "рдПрдореНрдмреЗрдб" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DT_RPATH
рдпрд╛ DT_RUNPATH
рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде .dynamic
рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рд▓рд┐рдВрдХрд░ рдЕрдзреНрдпрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗ рдЧрдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рджреЗрдЦреЗрдВ)ред
рдФрд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдпреБрд╡рд╛ рдбреЗрд╡рд▓рдкрд░, рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ "рдиреАрдВрдж" рди рдХрд░реЗрдВ!
RPATH рдХреИрд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ?
рдпреЛрдЧрд┐рдиреА рдореЗрдВ RPATH рд░рд┐рдХреЙрд░реНрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрд░ -rpath
рд╡рд┐рдХрд▓реНрдк рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
$ gcc -L./lib -Wall -Wl,-rpath=/run/media/pablo/disk1/projects/cheat_sheets/ELF/lib/ -o test_rpath.elf bubble_main.c -lbubble
рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрдорд╛рдВрдб рдореВрд▓реНрдп /run/media/pablo/disk1/projects/cheat_sheets/ELF/lib/
рд╕рд╛рде .dynamic
рд╕реЗрдХреНрд╢рди рдореЗрдВ рдПрдХ RPATH рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдПрдЧрд╛ред
readelf
рдЖрдк .dynamic
рдЕрдиреБрднрд╛рдЧ (рдЬрд┐рд╕рдореЗрдВ рдЖрд░рдкреАрдПрдЯреАрдПрдЪ рд╣реИ) рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
$ readelf -d test_rpath.elf
рдЯреАрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдордкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдЖрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Dynamic section at offset 0x2dd8 contains 28 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libbubble.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000f (RPATH) Library rpath: [/run/media/pablo/disk1/projects/cheat_sheets/ELF/lib/] 0x000000000000000c (INIT) 0x1000 0x000000000000000d (FINI) 0x11c8 ....
рд░рд╛рд╣рдд
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпреЛрдЧрд┐рдиреА рдореЗрдВ RPATH рд░рд┐рдХреЙрд░реНрдб рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
import lief from lief.ELF import DYNAMIC_TAGS elf = lief.parse("test_rpath.elf") if elf.has(DYNAMIC_TAGS.RPATH): rpath = next(filter(lambda x: x.tag == DYNAMIC_TAGS.RPATH, elf.dynamic_entries)) for path in rpath.paths: print(path) else: print("No RPATH in ELF")
.Dynamic рдЕрдиреБрднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ
рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдл рдХреА рдЬрд╛рдБрдЪ
рд╢реЛрдзрдХрд░реНрддрд╛ рдЯреЛрдмреАрд╕ рдХреНрд▓реЗрди ( рдП рдмрдЧ рд╣рдВрдЯрд░ рдХреА рдбрд╛рдпрд░реА рдХреЗ рд▓реЗрдЦрдХ) рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрд╛рдВрдЪ 2011 рд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдпрд╣ ELF рдлрд╛рдЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдХрд▓реНрдк Relro (рд░реАрдб рдУрдирд▓реА рд░рд┐рд▓реЛрдХреЗрд╢рдВрд╕), NX (рдиреЙрди-рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рд╕реНрдЯреИрдХ), рд╕реНрдЯреИрдХ рдХреИрдирд░реАрдЬрд╝, PIE (рдкреЛрдЬрд╝рд┐рд╢рди рдЗрдВрдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓реНрд╕) рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд░реАрдбрдлрд╝рд╛рдЗрд▓ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд░рд╛рд╣рдд
рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдШреБрдЯрдирд╛ рдкрд╛рдпрдерди рдФрд░ LIEF (рдкреВрд░реНрд╡рдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ-рдХреЛрдб рд╡рд┐рдХрд▓реНрдк рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде):
import lief from lief.ELF import DYNAMIC_TAGS, SEGMENT_TYPES def filecheck(filename): binary = lief.parse(filename)
Radare2
рдЪреЗрдХрдХреЗ рд╕рдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Radare2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ dukebarman рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж:
> r2 -ci~pic,canary,nx,crypto,stripped,static,relocs test_stack_proteck
рдПрд▓реНрдл рд╕реЗ рдХрдЪреНрдЪрд╛ рдХреЛрдб (рдИрдПрд▓рдПрдл рд╕реЗ рдмрд╛рдЗрдирд░реА)
рдРрд╕реЗ рд╣рд╛рд▓рд╛рдд рд╣реИрдВ рдЬрдм рдИрдПрд▓рдПрдл рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ "elven рдХрдкрдбрд╝реЗ" рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ "рдирдВрдЧреЗ" рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
objcopy
рдлрд░реНрдорд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдСрдЬреНрдХреЙрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реИ:
$ objcopy -O binary -S -g simple.elf simple.bin
-S
- рдЪрд░рд┐рддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП;-g
- рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рд░рд╛рд╣рдд
рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВред рдмрд╕ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реЗрдВ рдФрд░ рдЙрдирд╕реЗ рдПрдХ рдмрд╛рдирд░ рдмрдирд╛рдПрдВ:
import lief from lief.ELF import SECTION_FLAGS, SECTION_TYPES binary = lief.parse("test") end_addr = 0 data = [] for section in filter(lambda x: x.has(SECTION_FLAGS.ALLOC) and x.type != SECTION_TYPES.NOBITS, binary.sections): if 0 < end_addr < section.virtual_address: align_bytes = b'\x00' * (section.virtual_address - end_addr) data.append(align_bytes) data.append(bytes(section.content)) end_addr = section.virtual_address + section.size with open('test.lief.bin', 'wb') as f: for d_bytes in data: f.write(d_bytes)
рдордВрдЧрд▓реА - рдзреНрд╡рд╕реНрдд рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо
C ++ рдХреЛрдб рд╕реЗ рдмрдирд╛рдИ рдЧрдИ ELFs рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╕рдЬрд╛рдП рдЧрдП рд╣реИрдВ (mangled)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдРрд╕реЗ рдирд╛рдореЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рдЯреЗрд╕реНрдЯ рдпреЛрдЧрд┐рдиреА
рдПрдирдПрдо
рдорд╛рдирд╡-рдкрдардиреАрдп рд░реВрдк рдореЗрдВ рдирд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд┐рдиреНрдпреВрдЯрд┐рд▓реНрд╕ рд╕реЗрдЯ рд╕реЗ рдПрдирдПрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд░рд╛рд╣рдд
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдзреНрд╡рд╕реНрдд рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛:
import lief binary = lief.parse("demangle-test-cpp") for symb in binary.symbols: print(symb.name, symb.demangled_name)
рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЕрд╕реЗрдВрдмрд▓реА, рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ, рд╕рдВрд╢реЛрдзрди
рдЖрд╡реЗрджрди рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЬрдВрдЧрд▓реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдореЗрдЯрд╛-рд╕реВрдЪрдирд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
- рдбрд┐рдмрдЧ рд╕реЗрдХреНрд╢рди - рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрдХрд╛рд░;
- рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо - рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдереЛрдбрд╝рд╛ рдЙрд▓реНрдЯрд╛ рдкреЗрдЪреАрджрд╛ рд╣реЛрддрд╛ рд╣реИ);
- рдЕрдиреБрднрд╛рдЧ рддрд╛рд▓рд┐рдХрд╛ - рдЖрд╡реЗрджрди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рдХреА рдХрдореА рд░рд┐рд╡рд░реНрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧреА)ред
рдЪрд░рд┐рддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд░рд┐рд╡рд░реНрд╕ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рдкрдЯреНрдЯреА
рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдмрд┐рдиреБрдЯрд┐рд▓реНрд╕ рд╕реЗрдЯ рд╕реЗ рдкрдЯреНрдЯреА рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд╡рд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
sstrip
рдЪрд░рд┐рддреНрд░ рдЬрд╛рдирдХрд╛рд░реА (рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯреНрд╕ рд╕рд╣рд┐рдд) рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк ELFkickers рд╕реВрдЯ рд╕реЗ sstrip рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд╡рд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
$ sstrip -z simple
рд░рд╛рд╣рдд
LIEF рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рддреНрд╡рд░рд┐рдд рдкрдЯреНрдЯреА (рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ - рдЕрдиреБрднрд╛рдЧ .symtab
) рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
import lief binary = lief.parse("simple") binary.strip() binary.write("simple.stripped")
рдПрдХ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рд╣рдЯрд╛рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреБрднрд╛рдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдЖрд╡реЗрджрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдПрдХ рдЦрдВрдб рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрд┐рдирд╛, рдЖрд╡реЗрджрди рдХрд╛ рд░рд┐рд╡рд░реНрд╕ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдкрд╛рдпрдерди рдХреЗ рддрд╣рдд LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд╕реЗрдХреНрд╢рди рдЯреЗрдмрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
import lief binary = lief.parse("simple") binary.header.numberof_sections = 0 binary.header.section_header_offset = 0 binary.write("simple.modified")
рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ RPATH рдХреЛ рд╣рдЯрд╛рдПрдБ
рдЪрд░рдкрде, рдкреИрдЪреЗрд▓рдПрдл
рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд RPATH рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк chrpath рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рддрд░рдгреЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз) рдпрд╛ PatchELF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
RPATH рдмрджрд▓реЗрдВ:
$ chrpath -r /opt/my-libs/lib:/foo/lib test_rpath.elf
рдпрд╛
$ patchelf --set-rpath /opt/my-libs/lib:/foo/lib test_rpath.elf
RPATH рдирд┐рдХрд╛рд▓реЗрдВ:
$ chrpath -d test_rpath.elf
рдпрд╛
$ patchelf --shrink-rpath test_rpath.elf
рд░рд╛рд╣рдд
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ RPATH рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рджреЛрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
RPATH рдмрджрд▓реЗрдВ:
import lief binary = lief.parse("test_rpath.elf") rpath = next(filter(lambda x: x.tag == lief.ELF.DYNAMIC_TAGS.RPATH, binary.dynamic_entries)) rpath.paths = ["/opt/my-lib/here"] binary.write("test_rpath.patched")
RPATH рдирд┐рдХрд╛рд▓реЗрдВ:
import lief binary = lief.parse("test_rpath.elf") binary.remove(lief.ELF.DYNAMIC_TAGS.RPATH) binary.write("test_rpath.patched")
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд╛рдо рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ seveb рджреНрд╡рд╛рд░рд╛ crackme01 рд╕реЗ рдпреЛрдЧрд┐рдиреА crackme01_32bit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ:
import lief binary = lief.parse("crackme01_32bit") for i, symb in enumerate(binary.static_symbols): symb.name = "zzz_%d" % i binary.write("crackme01_32bit.obfuscated")
рдирддреАрдЬрддрди, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
$ readelf -s crackme01_32bit.obfuscated ... Symbol table '.symtab' contains 78 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND zzz_0 1: 08048154 0 SECTION LOCAL DEFAULT 1 zzz_1 2: 08048168 0 SECTION LOCAL DEFAULT 2 zzz_2 3: 08048188 0 SECTION LOCAL DEFAULT 3 zzz_3 4: 080481ac 0 SECTION LOCAL DEFAULT 4 zzz_4 5: 080481d0 0 SECTION LOCAL DEFAULT 5 zzz_5 6: 080482b0 0 SECTION LOCAL DEFAULT 6 zzz_6 7: 0804835a 0 SECTION LOCAL DEFAULT 7 zzz_7 8: 08048378 0 SECTION LOCAL DEFAULT 8 zzz_8 9: 080483b8 0 SECTION LOCAL DEFAULT 9 zzz_9 10: 080483c8 0 SECTION LOCAL DEFAULT 10 zzz_10 ...
PLT / GOT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
рдЬрд┐рд╕реЗ ELF PLT INFECTION рдХреЗ рдирд╛рдо рд╕реЗ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╖рдп рдкрд░ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝реЗрдВ:
рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдмрджрд▓реЗрдВ
рдкреИрдЪ рдмрдирд╛рддреЗ рд╕рдордп, рд╣реБрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдпрд╛ рдЫрд┐рдкреЗ рд╣реБрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо seveb рджреНрд╡рд╛рд░рд╛ рдХреНрд░реИрдХрдореЗ 01 рд╕реЗ рдПрд▓реНрдл рдХреНрд░реИрдХрдореЗ__32рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
radare2
radare2 рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рд╡рд┐рдХрд▓реНрдк -w
) - рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:
$ ./crackme01_32bit Please enter the secret number: ^C $ r2 -w -nn crackme01_32bit [0x00000000]> .pf.elf_header.entry=0x0804860D [0x00000000]> q $ ./crackme01_32bit Nope.
рд░рд╛рд╣рдд
import lief binary = lief.parse("crackme01_32bit") header = binary.header header.entrypoint = 0x0804860D binary.write("crackme01_32bit.patched")
рдХреЛрдб рдкреИрдЪ
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ, рджрд░рд╛рд░ рдХреЗ рд╕рд╛рде novn91 рдХреЗ рдХреНрд░реИрдХрдордкрд╛рд▓ рдХреЛ рд▓реЗрдВ ред рдЬрдм рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
$ ./crackmeMario usage <password>
рдЬрдм рдПрдХ рдордирдорд╛рдирд╛-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
./crackmeMario qwerty try again pal.
рд╣рдо рдПрдХ рдкреИрдЪ рдмрдирд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрджреЗрд╢ "рдЕрдЪреНрдЫрд╛ рдХрд╛рдо" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ! рдЕрдм рдореБрдЭреЗ keygen! тАЭ
radare2
radare2 рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкреИрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╛рда рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреИрдЪ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
# Rapatch for https://crackmes.one/crackme/5ccecc7e33c5d4419da559b3 !echo Patching crackme 0x115D : jmp 0x1226
рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЪ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
$ r2 -P patch.txt crackmeMario
рд░рд╛рдбрд╛рд░ 2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдЪрд┐рдВрдЧ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ:
рд░рд╛рд╣рдд
LIEF рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдкрд░ рдпреЛрдЧрд┐рдиреА (рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдмрд╛рдЗрдЯреНрд╕) рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреИрдЪ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
import lief binary = lief.parse("crackmeMario") binary.patch_address(0x115D, bytearray(b"\xe9\xc4\x00\x00\x00")) binary.write("crackmeMario.patched")
рдкреИрдЪ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛:
$ ./crackmeMario.patched good job! now keygen me!
ELF рдореЗрдВ рд╕реЗрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ
objcopy
objcopy рдЖрдкрдХреЛ рдПрдХ рд╕реЗрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реЗрдХреНрд╢рди рдХрд┐рд╕реА рднреА рд╕реЗрдЧрдореЗрдВрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рд╕рдордп рд░реИрдо рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛:
$ objcopy --add-section .testme=data.zip \ --set-section-flags .testme=alloc,contents,load,readonly \ --change-section-address .testme=0x08777777 \ simple simple.patched.elf
рд░рд╛рд╣рдд
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдПрдХ рдореМрдЬреВрджрд╛ ELF рдореЗрдВ рдПрдХ рдирдпрд╛ рдЦрдВрдб рдФрд░ рдЙрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЦрдВрдб ( loaded=True
рдлреНрд▓реИрдЧ) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:
import lief binary = lief.parse("simple") data = bytearray(b"\xFF" * 16) section = lief.ELF.Section(".testme", lief.ELF.SECTION_TYPES.PROGBITS) section += lief.ELF.SECTION_FLAGS.EXECINSTR section += lief.ELF.SECTION_FLAGS.ALLOC section.content = data binary.add(section, loaded=True) binary.write("simple.testme.lief")
рдЦрдВрдб рдмрджрд▓реЗрдВ
objcopy
objcopy рдЖрдкрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЕрдиреБрднрд╛рдЧ рдФрд░ рдЭрдВрдбреЗ рдХреЗ рдЖрднрд╛рд╕реА рдкрддреЗ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
$ objcopy --update-section .testme=patch.bin \ --change-section-address .testme=0x08999999 simple simple.testme.elf
рд░рд╛рд╣рдд
import lief binary = lief.parse("simple") data = bytearray(b"\xFF" * 17) section = binary.get_section(".text") section.content = data binary.write("simple.patched")
рдЕрдиреБрднрд╛рдЧ рд╣рдЯрд╛рдПрдБ
objcopy
objcopy рдЖрдкрдХреЛ рдирд╛рдо рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
$ objcopy --remove-section .testme simple.testme.elf simple.no_testme.elf
рд░рд╛рд╣рдд
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
import lief binary = lief.parse("simple.testme.elf") binary.remove_section(".testme") binary.write("simple.no_testme")
рдПрд▓реНрдл рдХрдВрдЯреЗрдирд░
рдиреБрд╕реНрдЦрд╛ Gremlins рдФрд░ ELF рдЬрд╛рджреВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ : рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ ELF рдлрд╝рд╛рдЗрд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ? ред рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЛрд▓рд╛рд░рд┐рд╕ рд╕реЗ рдПрд▓реНрдлреНрд░реИрдк рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЖрджрдореА рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдИрдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд▓реЛ рдкрд╛рдпрдерди рдФрд░ LIEF рдореЗрдВ рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдордп, LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдпреЛрдЧрд┐рдиреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдЦрд╛рд▓реА рдИрдПрд▓рдПрдл рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдВ:
$ echo "" | gcc -m32 -fpic -o empty.o -c -xc - $ gcc -m32 -shared -o libempty.so empty.o
рдЕрдм рдЖрдк рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import lief binary = lief.parse("libempty.so") filename = "crackme.zip" data = open(filename, 'rb').read()
рдПрд▓реНрдл "рдПрдХ рдЯреНрд░реЗрд▓рд░ рдХреЗ рд╕рд╛рде"
ELF рдкреНрд░рд╛рд░реВрдк рдЙрд╕ рдбреЗрдЯрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЦрдВрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕реЗ рдИрдПрд▓рдПрдл рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рдж рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд░реИрдо рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдИрдбреАрдП рдкреНрд░реЛ рдЗрд╕ рдбреЗрдЯрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
рдЯреНрд░реЗрд▓рд░ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг

radare2
"рдЯреНрд░реЗрд▓рд░" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
$ radare2 test.elf [0x00001040]> ?v $s 0x40c1 [0x00001040]> iZ 14699
readelf
readelf "рдЯреНрд░реЗрд▓рд░" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
$ ls -l test.elf
рд░рд╛рд╣рдд
LIEF рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ "рдЯреНрд░реЗрд▓рд░" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред LIEF рдХреЗ рдкреНрд░рдпреЛрдЧ рд╕реЗ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд░рд╕реАрд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ:
import lief binary = lief.parse("test")
рд╢реВрдиреНрдп рдПрд▓реНрдл (рдЦрд░реЛрдВрдЪ рд╕реЗ рдИрдПрд▓рдПрдл)
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЖрдк "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо "рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдИрдПрд▓рдПрдл" рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рдХ рдФрд░ рд▓рд┐рдВрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛:
рдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рд╕реЗ ELF рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЕрд╡рд╢реЛрд╖рдг рдкрд░ рд▓рд╛рднрдХрд╛рд░реА рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдпреЛрдЧрд┐рдиреА
рдпреЛрдЧрд┐рдиреА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдУрдПрд╕ рдореЗрдВ рд▓реЛрдбрд░ рд╕рднреА рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб рдФрд░ рд╕реЗрдЧрдореЗрдВрдЯ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдиреНрдпреВрдирддрдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдИрдПрд▓рдПрдл рд╣реЗрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдб рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
; tiny.asm BITS 32 org 0x00010000 db 0x7F, "ELF" ; e_ident dd 1 ; p_type dd 0 ; p_offset dd $$ ; p_vaddr dw 2 ; e_type ; p_paddr dw 3 ; e_machine dd _start ; e_version ; p_filesz dd _start ; e_entry ; p_memsz dd 4 ; e_phoff ; p_flags _start: mov bl, 42 ; e_shoff ; p_align xor eax, eax inc eax ; e_flags int 0x80 db 0 dw 0x34 ; e_ehsize dw 0x20 ; e_phentsize db 1 ; e_phnum ; e_shentsize ; e_shnum ; e_shstrndx filesize equ $ - $$
рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдИрдПрд▓рдПрдл рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ... 45 рдмрд╛рдЗрдЯреНрд╕ :
$ nasm -f bin -o a.out tiny.asm $ chmod +x a.out $ ./a.out ; echo $? 42 $ wc -c a.out 45 a.out
рдкреИрдЯрд░реНрди рдпреЛрдЧрд┐рдиреА
LIEF рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдпреЛрдЧрд┐рдиреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ (рдиреБрд╕реНрдЦрд╛ "рдПрд▓реНрдл-рдХрдВрдЯреЗрдирд░" рджреЗрдЦреЗрдВ):
- рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рд▓реЗрдВ;
- рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВ, рдирдП рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ;
- рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ (рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ, рдЭрдВрдбреЗ) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рд▓реЗрдЦ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ LIEF рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ ode рдЬреИрд╕рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рдирд╣реАрдВ рдерд╛ - рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗрдВред
рд╕рдиреНрджрд░реНрдн рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп