Source code for cle.backends.elf.regions
from __future__ import annotations
from cle.backends.region import Section, Segment
def maybedecode(string):
return string if isinstance(string, str) else string.decode()
[docs]
class ELFSegment(Segment):
"""
Represents a segment for the ELF format.
"""
[docs]
def __init__(self, readelf_seg, relro=False):
self.flags = readelf_seg.header.p_flags
self.relro = relro
super().__init__(
readelf_seg.header.p_offset,
readelf_seg.header.p_vaddr,
readelf_seg.header.p_filesz,
readelf_seg.header.p_memsz,
)
@property
def is_readable(self):
return self.flags & 4 != 0
@property
def is_writable(self):
return self.flags & 2 != 0
@property
def is_executable(self):
return self.flags & 1 != 0
@property
def is_relro(self):
return self.relro
[docs]
class ELFSection(Section):
SHF_WRITE = 0x1
SHF_ALLOC = 0x2
SHF_EXECINSTR = 0x4
SHF_STRINGS = 0x20
SHT_NULL = "SHT_NULL"
[docs]
def __init__(self, readelf_sec, remap_offset=0):
super().__init__(
maybedecode(readelf_sec.name),
readelf_sec.header.sh_offset,
readelf_sec.header.sh_addr + remap_offset,
readelf_sec.header.sh_size,
)
self.type = readelf_sec.header.sh_type
self.entsize = readelf_sec.header.sh_entsize
self.flags = readelf_sec.header.sh_flags
self.link = readelf_sec.header.sh_link
self.info = readelf_sec.header.sh_info
self.align = readelf_sec.header.sh_addralign
self.remap_offset = remap_offset
@property
def is_readable(self):
return True
@property
def is_active(self):
return self.type != self.SHT_NULL
@property
def is_writable(self):
return self.flags & self.SHF_WRITE != 0
@property
def occupies_memory(self):
return self.flags & self.SHF_ALLOC != 0 and self.memsize > 0
@property
def is_executable(self):
return self.flags & self.SHF_EXECINSTR != 0
@property
def is_strings(self):
return self.flags & self.SHF_STRINGS != 0
@property
def only_contains_uninitialized_data(self):
return self.type == "SHT_NOBITS"