Exemple #1
0
 def call(self, arg1):
     intval = struct.unpack('<I', bytes(arg1.load()))[0]
     # push rip
     ripbts = struct.pack('<I', self.context.registers['rip'])
     self.push(MemOperand(self.context, regs.index('$'), ripbts))
     # push ebp
     self.push(MemOperand(self.context, regs.index('rbp')))
     # mov esp ebp
     self.mov(MemOperand(self.context, regs.index('rsp')),
              MemOperand(self.context, regs.index('rbp')))
     self.jmp(arg1)
Exemple #2
0
    def ret(self):
        # mov ebp esp
        self.mov(MemOperand(self.context, regs.index('rbp')),
                 MemOperand(self.context, regs.index('rsp')))
        # pop ebp
        self.pop(MemOperand(self.context, regs.index('rbp')))

        # pop rip
        retloc = MemOperand(self.context, regs.index('%rsp')).load()
        self.context.registers['rsp'] = list(
            struct.pack(
                '<I',
                struct.unpack('<I', bytes(self.context.registers['rsp']))[0] +
                4))
        intval = struct.unpack('<I', bytes(retloc))[0]
        self.context.registers['rip'] = intval
Exemple #3
0
 def pop(self, arg1):  # unsafe?
     destination = MemOperand(self.context, regs.index('%rsp'))
     arg1.store(destination.load())
     self.context.registers['rsp'] = list(
         struct.pack(
             '<I',
             struct.unpack('<I', bytes(self.context.registers['rsp']))[0] +
             4))
Exemple #4
0
    def get_text_line_offsets(self, lines, symbols):
        res = []
        cur_pos = 0
        for line in lines:
            res.append([cur_pos, line])

            if line[0] == '.':
                continue

            cur_pos += 2

            tokens = line.split()[1:]
            for token in tokens:
                nodigit = ''.join([i for i in token if not i.isdigit()])
                if nodigit in regs:
                    if 10 <= regs.index(nodigit) <= 11:
                        cur_pos += 4
                elif token[1:] in symbols:
                    cur_pos += 4
                else:
                    raise Exception("Unknown symbol in line:\n" + line)
        res.append([cur_pos, ''])
        return res
Exemple #5
0
import pickle
import os
from config import regs, ops
lines = open('instructions.txt', 'r').read().split('\n')
try:
    os.mkdir('optables')
except:
    pass

version = lines.pop(0)

optable = []
lines = list(filter(lambda x: x != '', lines))

for line in lines:
    tokens = line.split()
    op = ops.index(tokens.pop(0))
    op_len = len(tokens)
    tokens = list(map(lambda x: regs.index(x), tokens))
    optable.append([op, op_len] + tokens + [line])
for op in optable:
    print(op)

pickle.dump(optable, open(os.path.join('optables', version + '.optbl'), 'wb'))