From d636d6a5293a95b20dc67bba3c52399f14c23cad Mon Sep 17 00:00:00 2001 From: ha1vk <2801045898@qq.com> Date: Mon, 8 Nov 2021 04:37:42 -0800 Subject: [PATCH] add support for 16bit mips and little endian --- serial_debuger/mips16e_asm.py | 27 ++++++++++++ serial_debuger/vx5_mips_debugger.py | 62 +++++++++++++++++----------- serial_debuger/vx_base_debugger.py | 34 +++++++++------ serial_debugger_example_with16bit.py | 34 +++++++++++++++ 4 files changed, 122 insertions(+), 35 deletions(-) create mode 100644 serial_debuger/mips16e_asm.py create mode 100644 serial_debugger_example_with16bit.py diff --git a/serial_debuger/mips16e_asm.py b/serial_debuger/mips16e_asm.py new file mode 100644 index 0000000..f5252bc --- /dev/null +++ b/serial_debuger/mips16e_asm.py @@ -0,0 +1,27 @@ +#coding:utf8 +import os +import binascii + +def ASM16(code,endian = 1): + template = ''' +.section .shellcode,"awx" +.global _start +.global __start +_start: +__start: +.set mips2 +.set noreorder +%s + ''' % code + f = open('1.binary.s','wb') + f.write(template) + f.close() + e = '-EL' if endian == 2 else '-EB' + os.system("mips-linux-gnu-as %s -mips16 -o 1.binary.tmp 1.binary.s" % e) + os.system('rm 1.binary.s') + os.system('mips-linux-gnu-objcopy -j .shellcode -Obinary 1.binary.tmp') + f = open('1.binary.tmp','rb') + content = f.read() + f.close() + os.system('rm 1.binary.tmp') + return content diff --git a/serial_debuger/vx5_mips_debugger.py b/serial_debuger/vx5_mips_debugger.py index d686dcd..cc9e9e3 100644 --- a/serial_debuger/vx5_mips_debugger.py +++ b/serial_debuger/vx5_mips_debugger.py @@ -7,7 +7,7 @@ from vx_base_debugger import VxSerialBaseDebuger from keystone import * from capstone import * - +from mips16e_asm import * MIPS_REGS = [ '$0', 't0', 's0', 't8', @@ -218,13 +218,17 @@ def text_update(self, update_address, update_size): self.logger.debug("current bp_address is zero, skip text update.") return None flag_address = self.current_bp_info["flag_address"] - original_update_count = struct.unpack("!I", self.get_mem_dump(flag_address + 0x14, 0x04))[0] - self.write_memory_data(flag_address + 0x0c, struct.pack('!I', update_address)) - self.write_memory_data(flag_address + 0x10, struct.pack('!I', update_size)) + pack_parm = ">I" + if self.endian == 2: + pack_parm = "