def print_row(name, value, default, docstring, ljust_optname, ljust_value, empty_space=6): name = ljust_colored(name, ljust_optname + empty_space) defval = extend_value_with_default(value, default) defval = ljust_colored(defval, ljust_value + empty_space) result = ' '.join((name, defval, docstring)) print(result) return result
def print_row(name, value, default, docstring, ljust_optname, ljust_value, empty_space=6): name = ljust_colored(name, ljust_optname + empty_space) defval = extend_value_with_default(value, default) defval = ljust_colored(defval, ljust_value + empty_space) result = ' '.join((name, defval, docstring)) print(result) return result
def instruction(ins): asm = '%-06s %s' % (ins.mnemonic, ins.op_str) if pwndbg.config.syntax_highlight: asm = syntax_highlight(asm) is_branch = set(ins.groups) & capstone_branch_groups # Highlight the current line if enabled if pwndbg.config.highlight_pc and ins.address == pwndbg.regs.pc: asm = C.highlight(asm) # tl;dr is a branch? if ins.target not in (None, ins.address + ins.size): sym = pwndbg.symbol.get(ins.target) or None target = M.get(ins.target) const = ins.target_const hextarget = hex(ins.target) hexlen = len(hextarget) # If it's a constant expression, color it directly in the asm. if const: asm = '%s <%s>' % (ljust_colored(asm, 36), target) asm = asm.replace(hex(ins.target), sym or target) # It's not a constant expression, but we've calculated the target # address by emulation or other means (for example showing ret instruction target) elif sym: asm = '%s <%s; %s>' % (ljust_colored(asm, 36), target, sym) # We were able to calculate the target, but there is no symbol # name for it. else: asm += '<%s>' % (target) # not a branch elif ins.symbol: if is_branch and not ins.target: asm = '%s <%s>' % (asm, ins.symbol) # XXX: not sure when this ever happens asm += '<-- file a pwndbg bug for this' else: inlined_sym = asm.replace(hex(ins.symbol_addr), ins.symbol) # display symbol as mem text if no inline replacement was made mem_text = ins.symbol if inlined_sym == asm else None asm = '%s <%s>' % (ljust_colored(inlined_sym, 36), M.get(ins.symbol_addr, mem_text)) # Style the instruction mnemonic if it's a branch instruction. if is_branch: asm = asm.replace(ins.mnemonic, branch(ins.mnemonic), 1) # If we know the conditional is taken, mark it as taken. if ins.condition is None: asm = ' ' + asm elif ins.condition: asm = on('✔ ') + asm else: asm = ' ' + asm return asm
def instruction(ins): asm = '%-06s %s' % (ins.mnemonic, ins.op_str) # TODO: detect 'arm', 'x86,64' is only for Intel x86/64 _highlighted, asm = pwndbg.color.syntax_highlight(asm, language='ARM') is_branch = set(ins.groups) & capstone_branch_groups # Highlight the current line if enabled if pwndbg.config.highlight_pc and ins.address == pwndbg.regs.pc: asm = C.highlight(asm) # tl;dr is a branch? if ins.target not in (None, ins.address + ins.size): sym = pwndbg.symbol.get(ins.target) or None target = M.get(ins.target) const = ins.target_const hextarget = hex(ins.target) hexlen = len(hextarget) # If it's a constant expression, color it directly in the asm. if const: asm = asm.replace(hex(ins.target), sym or target) if sym: asm = '%s <%s>' % (ljust_colored(asm, 36), target) # It's not a constant expression, but we've calculated the target # address by emulation. elif sym: asm = '%s <%s; %s>' % (ljust_colored(asm, 36), target, sym) # We were able to calculate the target, but there is no symbol # name for it. else: asm += '<%s>' % (target) # not a branch elif ins.symbol: if is_branch and not ins.target: asm = '%s <%s>' % (asm, ins.symbol) # XXX: not sure when this ever happens asm += '<-- file a pwndbg bug for this' else: asm = asm.replace(hex(ins.symbol_addr), ins.symbol) asm = '%s <%s>' % (ljust_colored(asm, 36), M.get(ins.symbol_addr)) # Style the instruction mnemonic if it's a branch instruction. if is_branch: asm = asm.replace(ins.mnemonic, branch(ins.mnemonic), 1) # If we know the conditional is taken, mark it as green. if ins.condition is None: asm = ' ' + asm elif ins.condition: asm = green('✔ ') + asm else: asm = ' ' + asm return asm
def banner(title): title = title.upper() _height, width = get_window_size() title = '%s%s%s' % (config.banner_title_surrounding_left, C.banner_title(title), config.banner_title_surrounding_right) if 'left' == title_position: banner = ljust_colored(title, width, config.banner_separator) elif 'right' == title_position: banner = rjust_colored(title, width, config.banner_separator) else: banner = rjust_colored(title, (width + len(strip(title))) // 2, config.banner_separator) banner = ljust_colored(banner, width, config.banner_separator) return C.banner(banner)
def banner(title): title = title.upper() _height, width = get_window_size() title = '%s%s%s' % (config.banner_title_surrounding_left, C.banner_title(title), config.banner_title_surrounding_right) position = str(title_position) if 'left' == position: banner = ljust_colored(title, width, str(config.banner_separator)) elif 'right' == position: banner = rjust_colored(title, width, str(config.banner_separator)) else: banner = rjust_colored(title, (width + len(strip(title))) // 2, str(config.banner_separator)) banner = ljust_colored(banner, width, str(config.banner_separator)) return C.banner(banner)
def banner(title, target=sys.stdin, width=None): title = title.upper() if width is None: # auto width. In case of stdout, it's better to use stdin (b/c GdbOutputFile) _height, width = get_window_size( target=target if target != sys.stdout else sys.stdin) if title: title = '%s%s%s' % (config.banner_title_surrounding_left, C.banner_title(title), config.banner_title_surrounding_right) if 'left' == title_position: banner = ljust_colored(title, width, config.banner_separator) elif 'right' == title_position: banner = rjust_colored(title, width, config.banner_separator) else: banner = rjust_colored(title, (width + len(strip(title))) // 2, config.banner_separator) banner = ljust_colored(banner, width, config.banner_separator) return C.banner(banner)
def instruction(ins): asm = '%-06s %s' % (ins.mnemonic, ins.op_str) if pwndbg.config.syntax_highlight: asm = syntax_highlight(asm) is_branch = set(ins.groups) & capstone_branch_groups # Highlight the current line if enabled if pwndbg.config.highlight_pc and ins.address == pwndbg.regs.pc: asm = C.highlight(asm) # tl;dr is a branch? if ins.target not in (None, ins.address + ins.size): sym = pwndbg.symbol.get(ins.target) or None target = M.get(ins.target) const = ins.target_const # Use format string instead of hex() to avoid suffix 'l' or 'L' hextarget = '0x%x' % ins.target hexlen = len(hextarget) # If it's a constant expression, color it directly in the asm. if const: # TODO: Also colorize the address starts with '$' and '#' asm = asm.replace(hextarget, sym or target) if sym: asm = '%s <%s>' % (ljust_colored(asm, 36), target) # It's not a constant expression, but we've calculated the target # address by emulation. elif sym: asm = '%s <%s; %s>' % (ljust_colored(asm, 36), target, sym) # We were able to calculate the target, but there is no symbol # name for it. else: asm += '<%s>' % (target) # not a branch elif ins.symbol: if is_branch and not ins.target: asm = '%s <%s>' % (asm, ins.symbol) # XXX: not sure when this ever happens asm += '<-- file a pwndbg bug for this' else: asm = asm.replace(hex(ins.symbol_addr), ins.symbol) asm = '%s <%s>' % (ljust_colored(asm, 36), M.get(ins.symbol_addr)) # Style the instruction mnemonic if it's a branch instruction. if is_branch: asm = asm.replace(ins.mnemonic, branch(ins.mnemonic), 1) # If we know the conditional is taken, mark it as taken. if ins.condition is None: asm = ' ' + asm elif ins.condition: asm = on('✔ ') + asm else: asm = ' ' + asm return asm