def _populate_libraries(self): """ >>> from os.path import exists >>> bash = ELF(which('bash')) >>> all(map(exists, bash.libs.keys())) True >>> any(map(lambda x: 'libc' in x, bash.libs.keys())) True """ if not self.get_section_by_name('.dynamic'): self.libs= {} return try: cmd = sh_string.sh_command_with('ulimit -s unlimited; LD_TRACE_LOADED_OBJECTS=1 LD_WARN=1 LD_BIND_NOW=1 %s 2>/dev/null', self.path) data = subprocess.check_output(cmd, shell = True, stderr = subprocess.STDOUT) libs = misc.parse_ldd_output(data) for lib in dict(libs): if os.path.exists(lib): continue qemu_lib = '/etc/qemu-binfmt/%s/%s' % (get_qemu_arch(arch=self.arch), lib) if os.path.exists(qemu_lib): libs[os.path.realpath(qemu_lib)] = libs.pop(lib) self.libs = libs except subprocess.CalledProcessError: self.libs = {}
def libs(self): """libs() -> dict Return a dictionary mapping the path of each shared library loaded by the process to the address it is loaded at in the process' address space. If ``/proc/$PID/maps`` for the process cannot be accessed, the output of ``ldd`` alone is used. This may give inaccurate results if ASLR is enabled. """ with context.local(log_level='error'): ldd = process(['ldd', self.executable]).recvall() maps = parse_ldd_output(ldd) try: maps_raw = open('/proc/%d/maps' % self.pid).read() except IOError: return maps # Enumerate all of the libraries actually loaded right now. for line in maps_raw.splitlines(): if '/' not in line: continue path = line[line.index('/'):] path = os.path.realpath(path) if path not in maps: maps[path]=0 for lib in maps: path = os.path.realpath(lib) for line in maps_raw.splitlines(): if line.endswith(path): address = line.split('-')[0] maps[lib] = int(address, 16) break return maps
def libs(self): """libs() -> dict Return a dictionary mapping the path of each shared library loaded by the process to the address it is loaded at in the process' address space. If ``/proc/$PID/maps`` for the process cannot be accessed, the output of ``ldd`` alone is used. This may give inaccurate results if ASLR is enabled. """ with context.local(log_level='error'): ldd = process(['ldd', self.executable]).recvall() maps = parse_ldd_output(ldd) try: maps_raw = open('/proc/%d/maps' % self.pid).read() except IOError: return maps # Enumerate all of the libraries actually loaded right now. for line in maps_raw.splitlines(): if '/' not in line: continue path = line[line.index('/'):] path = os.path.realpath(path) if path not in maps: maps[path]=0 for lib in maps: path = os.path.realpath(lib) for line in maps_raw.splitlines(): if line.endswith(path): address = line.split('-')[0] maps[lib] = int(address, 16) break return maps