1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
# -*- coding: utf-8 -*-
import six
class Gadget(object):
"""
Describes a ROP gadget
"""
#: Address of the first instruction of the gadget
address = 0
#: List of disassembled instruction mnemonics
#:
#: Examples:
#: ['pop eax', 'ret']
insns = []
#: OrderedDict of register to:
#:
#: - Offset from the top of the frame at which it's set
#: - Name of the register which it is set from
#:
#: Order is determined by the order of instructions.
#:
#: Examples:
#:
#: ret => {}
#: pop eax; ret => {'eax': 0}
#: pop ebx; pop eax; ret => {'ebx': 0, 'eax': 4}
#: add esp, 0x10; pop ebx; ret => {'ebx': 16}
#: mov eax, ebx; ret => {'eax': 'ebx'}
regs = {}
#: The total amount that the stack pointer is modified by
#:
#: Examples:
#: ret ==> 4
#: add esp, 0x10; ret ==> 0x14
move = 0
def __init__(self, address, insns, regs, move):
self.address = int(address)
self.insns = insns
self.regs = regs
self.move = move
__indices = ['address', 'details']
def __repr__(self):
return "%s(%#x, %r, %r, %#x)" % (self.__class__.__name__,
self.address,
self.insns,
self.regs,
self.move)
def __getitem__(self, key):
# Backward compatibility
if isinstance(key, six.integer_types):
key = self.__indices[key]
return getattr(self, key)
def __setitem__(self, key, value):
# Backward compatibility
if isinstance(key, six.integer_types):
key = self.__indices[key]
return setattr(self, key, value)
|