def unsortedbins(self): '''str: pretty formated unsortedbins str. ''' head = color.magenta('unsortedbins: ') tail = '' for chunk in self.record.unsortedbins: tail += '<-> ' + color.blue("{:#x} ".format(chunk._addr)) if tail == '': tail = color.blue('None') return head+tail
def basic(self): return '''libc_version:{} arch:{} tcache_enable:{} libc_base:{} heap_base:{}'''.format( color.yellow(self.record.libc_version), color.yellow(self.record.arch), color.yellow(self.record.tcache_enable), color.blue(hex(self.record.libc_base)), color.blue(hex(self.record.heap_base)) )
def all(self): '''str: pretty formated all infomation of heap. ''' lines = [self.banner('HeapInspect', 'green')] lines.append(self.basic) lines.append(self.fastbins) lines.append(self.smallbins) lines.append(self.largebins) lines.append(self.tcache_chunks) lines.append( color.magenta('top: ') + color.blue('{:#x}'.format(self.record.main_arena.top)) ) lines.append( color.magenta('last_remainder: ') + color.blue('{:#x}'.format(self.record.main_arena.last_remainder)) ) lines.append(self.unsortedbins) return '\n'.join(lines)
def smallbins(self): '''str: pretty formated smallbins str. ''' lines = [] header_fmt = color.green('({size:#x}) smallbins[{index}] ') for index in sorted(self.record.smallbins.keys()): size = 2*self.record.size_t * (index+1) chunks = self.record.smallbins[index] tail = '' for chunk in chunks: tail += "<-> " + color.blue("{:#x} ".format(chunk._addr)) line = header_fmt.format(size=size, index=index-1) + tail if tail != '': lines.append(line) return '\n'.join(lines)
def tcache_chunks(self): '''str: pretty formated tcache chunks str. ''' lines = [] header_fmt = color.yellow('({size:#x}) entries[{index}] ') for index in sorted(self.record.tcache_chunks.keys()): size = 4*self.record.size_t + index*0x10 chunks = self.record.tcache_chunks[index] tail = '' for chunk in chunks: tail += "-> " + color.blue("{:#x} ".format( chunk._addr+2*self.record.size_t)) line = header_fmt.format(size=size, index=index) + tail if tail != '': lines.append(line) return '\n'.join(lines)
def largebins(self): '''str: pretty formated largebins str. ''' lines = [] header_fmt = color.green('largebins[{index}] ') for index in sorted(self.record.largebins.keys()): size = 2*self.record.size_t * (index+1) chunks = self.record.largebins[index] tail = '' for chunk in chunks: tail += "<-> " + \ color.blue( "{:#x}".format(chunk._addr) + color.green("({:#x}) ".format(chunk.size & ~0b111)) ) line = header_fmt.format(size=size, index=index-0x3f) + tail if tail != '': lines.append(line) return '\n'.join(lines)