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)
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
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))
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
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'))