mirror of https://github.com/pwndbg/pwndbg.git
WIPWIPWIP
parent
add3acba15
commit
c6347c6bd6
@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Stepping until an event occurs
|
||||
"""
|
||||
|
||||
@pwndbg.commands.Command
|
||||
@pwndbg.commands.OnlyWhenRunning
|
||||
def nextcall(*args):
|
||||
@ -0,0 +1,89 @@
|
||||
|
||||
|
||||
groups = {v:k for k,v in globals().items() if k.startswith('CS_GRP_')}
|
||||
ops = {v:k for k,v in globals().items() if k.startswith('CS_OP_')}
|
||||
access = {v:k for k,v in globals().items() if k.startswith('CS_AC_')}
|
||||
|
||||
for value1, name1 in access.items():
|
||||
for value2, name2 in access.items():
|
||||
access.setdefault(value1 | value2, '%s | %s' % (name1, name2))
|
||||
|
||||
class DisassemblyAssistant(object):
|
||||
def __init__(self):
|
||||
self.op_handlers = {
|
||||
CS_OP_IMM: self.immediate,
|
||||
CS_OP_REG: self.register,
|
||||
CS_OP_MEM: self.memory
|
||||
}
|
||||
|
||||
self.op_names = {
|
||||
CS_OP_IMM: self.immediate_sz,
|
||||
CS_OP_REG: self.register_sz,
|
||||
CS_OP_MEM: self.memory_sz
|
||||
}
|
||||
|
||||
def operands(self, instruction):
|
||||
current = (instruction.address == pwndbg.regs.pc)
|
||||
|
||||
rv = collections.OrderedDict()
|
||||
|
||||
for i, op in enumerate(instruction.operands):
|
||||
T = op.type
|
||||
|
||||
if not current or T not in op_handlers:
|
||||
rv['op%i' % i] = None
|
||||
continue
|
||||
|
||||
result = self.op_handlers[T](instruction, op)
|
||||
|
||||
if result is not None:
|
||||
rv[self.op_names[T]] = result
|
||||
|
||||
return rv
|
||||
|
||||
def immediate(self, instruction, operand):
|
||||
return operand.value.imm
|
||||
|
||||
def immediate_sz(self, instruction, operand):
|
||||
return "%#x" % self.immediate(instruction, operand)
|
||||
|
||||
def register(self, instruction, operand):
|
||||
# Don't care about registers which are only overwritten
|
||||
if operand.access & CS_AC_READ == 0:
|
||||
return None
|
||||
|
||||
reg = operand.value.reg
|
||||
name = instruction.reg_name(reg)
|
||||
|
||||
return pwndbg.regsisters[name]
|
||||
|
||||
def register_sz(self, instruction, operand):
|
||||
reg = operand.value.reg
|
||||
return instruction.reg_name(reg).lower()
|
||||
|
||||
def memory(self, instruction, operand):
|
||||
return None
|
||||
|
||||
def memory_sz(self, instruction, operand):
|
||||
raise NotImplementedError
|
||||
|
||||
def dump(self, instruction):
|
||||
ins = instruction
|
||||
rv = []
|
||||
rv.append('%s %s' % (ins.mnemonic,ins.op_str))
|
||||
|
||||
for i, group in enumerate(ins.groups):
|
||||
rv.append(' groups[%i] = %s' % (i, groups[group]))
|
||||
|
||||
ops = self.operands(instruction)
|
||||
|
||||
for i, ((name, value), op) in enumerate(zip(ops.items(), ins.operands)):
|
||||
rv.append(' operands[%i] = %s' % (i, ops[op.type]))
|
||||
rv.append(' access = %s' % (get_access(op.access)))
|
||||
|
||||
if None not in (name, value):
|
||||
rv.append(' %s = %#x' % (name, value))
|
||||
|
||||
return '\n'.join(rv)
|
||||
|
||||
assistant = DisassemblyAssistant()
|
||||
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
import collections
|
||||
|
||||
import pwndbg.arch
|
||||
import pwndbg.disasm.arch
|
||||
import pwndbg.memory
|
||||
import pwndbg.regs
|
||||
|
||||
from capstone import *
|
||||
from capstone.arm import *
|
||||
|
||||
import pwndbg.disasm.arch
|
||||
|
||||
import pdb
|
||||
pdb.set_trace()
|
||||
|
||||
class DisassemblyAssistant(pwndbg.disasm.arch.DisassemblyAssistant):
|
||||
def memory_sz(self, instruction, operand):
|
||||
segment = ''
|
||||
parts = []
|
||||
|
||||
if op.mem.base != 0:
|
||||
parts.append(instruction.reg_name(op.mem.base))
|
||||
|
||||
if op.mem.disp != 0:
|
||||
parts.append("%#x" % op.value.mem.disp)
|
||||
|
||||
if op.mem.index != 0:
|
||||
index = pwndbg.regs[instruction.reg_name(op.mem.index)]
|
||||
scale = op.mem.scale
|
||||
parts.append("%s*%#x" % (index, scale))
|
||||
|
||||
return "[%s]" % (segment, ', '.join(parts))
|
||||
|
||||
def immediate_sz(self, instruction, operand):
|
||||
imm = self.immediate(instruction, operand)
|
||||
imm = self.arch.signed(imm)
|
||||
|
||||
if abs(imm) < 0x10:
|
||||
return '#%i' % imm
|
||||
|
||||
return '#%#x' % imm
|
||||
|
||||
assistant = DisassemblyAssistant()
|
||||
|
||||
def is_jump_taken(instruction):
|
||||
cpsr = pwndbg.regs.cpsr
|
||||
|
||||
N = cpsr & (1<<31)
|
||||
Z = cpsr & (1<<30)
|
||||
C = cpsr & (1<<29)
|
||||
V = cpsr & (1<<28)
|
||||
|
||||
return {
|
||||
ARM_CC_EQ: Z,
|
||||
ARM_CC_NE: not Z,
|
||||
ARM_CC_HS: C,
|
||||
ARM_CC_LO: not C,
|
||||
ARM_CC_MI: N,
|
||||
ARM_CC_PL: not N,
|
||||
ARM_CC_VS: V,
|
||||
ARM_CC_VC: not V,
|
||||
ARM_CC_HI: C and not Z,
|
||||
ARM_CC_LS: Z or not C,
|
||||
ARM_CC_GE: N == V,
|
||||
ARM_CC_LT: N != V,
|
||||
ARM_CC_GT: not Z and (N==V),
|
||||
ARM_CC_LE: Z or (N != V),
|
||||
# ARM_CC_AL: 1,
|
||||
}.get(instruction.id, None)
|
||||
|
||||
is_condition_true = is_jump_taken
|
||||
@ -1,100 +0,0 @@
|
||||
# Table stolen from
|
||||
# http://ps-2.kev009.com/wisclibrary/aix52/usr/share/man/info/en_US/a_doc_lib/aixassem/alangref/branch_mnem.htm
|
||||
powerpc = """
|
||||
bc+ bc- bca+ bca-
|
||||
bcctr+ bcctr- bcctrl+ bcctrl-
|
||||
bcl+ bcl- bcla+ bcla-
|
||||
bclr+ bclr- bclrl+ bclrl-
|
||||
bdneq+ bdneq- bdnge+ bdnge-
|
||||
bdngt+ bdngt- bdnle+ bdnle-
|
||||
bdnlt+ bdnlt- bdnne+ bdnne-
|
||||
bdnns+ bdnns- bdnso+ bdnso-
|
||||
bdnz+ bdnz- bdnza+ bdnza-
|
||||
bdnzf+ bdnzf- bdnzfa+ bdnzfa-
|
||||
bdnzfl+ bdnzfl- bdnzfla+ bdnzfla-
|
||||
bdnzflr+ bdnzflr- bdnzflrl+ bdnzflrl-
|
||||
bdnzl+ bdnzl- bdnzla+ bdnzla-
|
||||
bdnzlr+ bdnzlr- bdnzlrl+ bdnzlrl-
|
||||
bdnzt+ bdnzt- bdnzta+ bdnzta-
|
||||
bdnztl+ bdnztl- bdnztla+ bdnztla-
|
||||
bdnztlr+ bdnztlr- bdnztlrl+ bdnztlrl-
|
||||
bdz+ bdz- bdza+ bdza-
|
||||
bdzeq+ bdzeq- bdzf+ bdzf-
|
||||
bdzfa+ bdzfa- bdzfl+ bdzfl-
|
||||
bdzfla+ bdzfla- bdzflr+ bdzflr-
|
||||
bdzflrl+ bdzflrl- bdzge+ bdzge-
|
||||
bdzgt+ bdzgt- bdzl+ bdzl-
|
||||
bdzla+ bdzla- bdzle+ bdzle-
|
||||
bdzlr+ bdzlr- bdzlrl+ bdzlrl-
|
||||
bdzlt+ bdzlt- bdzne+ bdzne-
|
||||
bdzns+ bdzns- bdzso+ bdzso-
|
||||
bdzt+ bdzt- bdzta+ bdzta-
|
||||
bdztl+ bdztl- bdztla+ bdztla-
|
||||
bdztlr+ bdztlr- bdztlrl+ bdztlrl-
|
||||
beq+ beq- beqa+ beqa-
|
||||
beqctr+ beqctr- beqctrl+ beqctrl-
|
||||
beql+ beql- beqla+ beqla-
|
||||
beqlr+ beqlr- beqlrl+ beqlrl-
|
||||
bf+ bf- bfa+ bfa-
|
||||
bfctr+ bfctr- bfctrl+ bfctrl-
|
||||
bfl+ bfl- bfla+ bfla-
|
||||
bflr+ bflr- bflrl+ bflrl-
|
||||
bge+ bge- bgea+ bgea-
|
||||
bgectr+ bgectr- bgectrl+ bgectrl-
|
||||
bgel+ bgel- bgela+ bgela-
|
||||
bgelr+ bgelr- bgelrl+ bgelrl-
|
||||
bgt+ bgt- bgta+ bgta-
|
||||
bgtctr+ bgtctr- bgtctrl+ bgtctrl-
|
||||
bgtl+ bgtl- bgtla+ bgtla-
|
||||
bgtlr+ bgtlr- bgtlrl+ bgtlrl-
|
||||
ble+ ble- blea+ blea-
|
||||
blectr+ blectr- blectrl+ blectrl-
|
||||
blel+ blel- blela+ blela-
|
||||
blelr+ blelr- blelrl+ blelrl-
|
||||
blt+ blt- blta+ blta-
|
||||
bltctr+ bltctr- bltctrl+ bltctrl-
|
||||
bltl+ bltl- bltla+ bltla-
|
||||
bltlr+ bltlr- bltlrl+ bltlrl-
|
||||
bne+ bne- bnea+ bnea-
|
||||
bnectr+ bnectr- bnectrl+ bnectrl-
|
||||
bnel+ bnel- bnela+ bnela-
|
||||
bnelr+ bnelr- bnelrl+ bnelrl-
|
||||
bng+ bng- bnga+ bnga-
|
||||
bngctr+ bngctr- bngctrl+ bngctrl-
|
||||
bngl+ bngl- bngla+ bngla-
|
||||
bnglr+ bnglr- bnglrl+ bnglrl-
|
||||
bnl+ bnl- bnla+ bnla-
|
||||
bnlctr+ bnlctr- bnlctrl+ bnlctrl-
|
||||
bnll+ bnll- bnlla+ bnlla-
|
||||
bnllr+ bnllr- bnllrl+ bnllrl-
|
||||
bns+ bns- bnsa+ bnsa-
|
||||
bnsctr+ bnsctr- bnsctrl+ bnsctrl-
|
||||
bnsl+ bnsl- bnsla+ bnsla-
|
||||
bnslr+ bnslr- bnslrl+ bnslrl-
|
||||
bnu+ bnu- bnua+ bnua-
|
||||
bnuctr+ bnuctr- bnuctrl+ bnuctrl-
|
||||
bnul+ bnul- bnula+ bnula-
|
||||
bnulr+ bnulr- bnulrl+ bnulrl-
|
||||
bnz+ bnz- bnza+ bnza-
|
||||
bnzctr+ bnzctr- bnzctrl+ bnzctrl-
|
||||
bnzl+ bnzl- bnzla+ bnzla-
|
||||
bnzlr+ bnzlr- bnzlrl+ bnzlrl-
|
||||
bso+ bso- bsoa+ bsoa-
|
||||
bsoctr+ bsoctr- bsoctrl+ bsoctrl-
|
||||
bsol+ bsol- bsola+ bsola-
|
||||
bsolr+ bsolr- bsolrl+ bsolrl-
|
||||
bt+ bt- bta+ bta-
|
||||
btctr+ btctr- btctrl+ btctrl-
|
||||
btl+ btl- btla+ btla-
|
||||
btlr+ btlr- btlrl+ btlrl-
|
||||
bun+ bun- buna+ buna-
|
||||
bunctr+ bunctr- bunctrl+ bunctrl-
|
||||
bunl+ bunl- bunla+ bunla-
|
||||
bunlr+ bunlr- bunlrl+ bunlrl-
|
||||
bz+ bz- bza+ bza-
|
||||
bzctr+ bzctr- bzctrl+ bzctrl-
|
||||
bzl+ bzl- bzla+ bzla-
|
||||
bzlr+ bzlr- bzlrl+ bzlrl-
|
||||
""".strip().split()
|
||||
|
||||
branches = set(map(lambda x: x.rstrip('+-'), powerpc))
|
||||
Loading…
Reference in new issue