Exemplo n.º 1
0
 def init_enclave_debug(self):
     # Only product HW enclave can't be debugged
     if (self.enclave_type & ET_SIM) != ET_SIM and (self.enclave_type
                                                    & ET_DEBUG) != ET_DEBUG:
         print(
             'Warning: {0:s} is a product hardware enclave. It can\'t be debugged and sgx_emmt doesn\'t work'
             .format(self.enclave_path))
         return -1
     # set TCS debug flag
     for tcs_addr in self.tcs_addr_list:
         string = read_from_memory(tcs_addr + 8, 4)
         if string == None:
             return 0
         flag = struct.unpack('I', string)[0]
         flag |= 1
         gdb_cmd = "set *(unsigned int *)%#x = %#x" % (tcs_addr + 8, flag)
         gdb.execute(gdb_cmd, False, True)
     #If it is a product enclave, won't reach here.
     #load enclave symbol
     if os.path.exists(self.enclave_path) == True:
         enclave_path = self.enclave_path
     else:
         enclave_path = target_path_to_host_path(self.enclave_path)
     gdb_cmd = load_symbol_cmd.GetLoadSymbolCommand(enclave_path,
                                                    str(self.start_addr))
     if gdb_cmd == -1:
         return 0
     print(gdb_cmd)
     gdb.execute(gdb_cmd, False, True)
     global ENCLAVES_ADDR
     ENCLAVES_ADDR[self.start_addr] = gdb_cmd.split()[2]
     return 0
Exemplo n.º 2
0
    def stop(self):
        global ubase, heap_size, debug_file
        try:
            ubase = gdb.parse_and_eval("(uint64_t)ubase")
            heap_size = gdb.parse_and_eval("(uint64_t)heap_size")
            print("Enclave base: %x" % int(ubase))
            print("Enclave heap size: %d" % int(heap_size))
        except:
            print("Error while trying to determine enclave base address")
            return False

        gdb_cmd = load_symbol_cmd.GetLoadSymbolCommand(
            debug_file.filename + ".debug", str(ubase), str(heap_size))
        if gdb_cmd == -1:
            return 0
        print(gdb_cmd)
        gdb.execute(gdb_cmd, False, True)

        tcs_num = int(gdb.parse_and_eval("get_tcs_num()"))
        for i in range(tcs_num):
            tcs_addr = gdb.parse_and_eval("get_tcs_addr(" + str(i) + ")")
            gdb_cmd = "set *(unsigned int *)%#x = %#x" % (
                int(tcs_addr.cast(gdb.lookup_type('long'))) + 8, 1)
            gdb.execute(gdb_cmd, False, True)

        self.enabled = False
        return False
Exemplo n.º 3
0
def load_enclave_symbol(enclave_path, enclave_base_addr):
    """Load enclave symbol file into current debug session"""
    if os.path.exists(enclave_path) == True:
        enclave_path = os.path.abspath(enclave_path)
    else:
        enclave_path = target_path_to_host_path(enclave_path)
    gdb_cmd = load_symbol_cmd.GetLoadSymbolCommand(enclave_path, str(enclave_base_addr))
    if gdb_cmd == -1:
        print ("Can't get symbol loading command.")
        return False
    # print (gdb_cmd)
    gdb.execute(gdb_cmd, False, True)
    # Store the oe_enclave address to global set that will be cleanup on exit.
    global g_loaded_oe_enclave_addrs
    g_loaded_oe_enclave_addrs.add(int(gdb_cmd.split()[2], 16))
    return True
Exemplo n.º 4
0
 def stop(self):
     addr_ = gdb.parse_and_eval("$rdi")
     addr = ctypes.c_uint64(addr_).value
     file_name_ = gdb.parse_and_eval("$rsi")
     file_name = ctypes.c_uint64(file_name_).value
     file_name_len_ = gdb.parse_and_eval("$rdx")
     file_name_len = ctypes.c_uint64(file_name_len_).value
     file_string = read_from_memory(file_name, file_name_len)
     file_path = "image" + \
                 struct.unpack('{length}s'.format(length=file_name_len), \
                                 file_string[0:file_name_len])[0].decode("ascii")
     gdb_cmd = load_symbol_cmd.GetLoadSymbolCommand(file_path, str(addr))
     if gdb_cmd == -1:
         return 0
     print (gdb_cmd)
     gdb.execute(gdb_cmd, False, True)
     GetMuslLoadLibraryBreakpoint()
     return False
Exemplo n.º 5
0
 def stop(self):
     dso_addr_ = gdb.parse_and_eval("$rax")
     dso_addr  = ctypes.c_uint64(dso_addr_).value
     string = read_from_memory(dso_addr, 16)
     elf_start_addr, elf_name_addr = struct.unpack('QQ', string)
     # Assume the file name length is less than 512
     string = read_from_memory(elf_name_addr, 512)
     elf_name = "image"
     for i in range(512):
         if string[i] != struct.pack("B", 0):
             elf_name += string[i].decode('ascii')
         else:
             break
     gdb_cmd = load_symbol_cmd.GetLoadSymbolCommand(elf_name, str(elf_start_addr))
     if gdb_cmd == -1:
         return 0
     gdb.execute(gdb_cmd, False, True)
     return False
Exemplo n.º 6
0
def load_enclave_symbol(enclave_path, enclave_base_addr):
    """Load enclave symbol file into current debug session"""

    if os.path.exists(enclave_path) == True:
        enclave_path = os.path.abspath(enclave_path)
    else:
        enclave_path = target_path_to_host_path(enclave_path)
    lldb_cmd = load_symbol_cmd.GetLoadSymbolCommand(enclave_path,
                                                    str(enclave_base_addr))
    if lldb_cmd == -1:
        print("Can't get symbol loading command.")
        return False

    commands = lldb_cmd.split('\n')
    for cmd in commands:
        lldb.debugger.HandleCommand(cmd)
        #print(cmd)

    # Store the oe_enclave address to global set that will be cleanup on exit.
    global g_loaded_oe_enclave_addrs
    arg_list = lldb_cmd.split()
    g_loaded_oe_enclave_addrs.add(
        int(arg_list[arg_list.index(".text") + 1], 16))
    return True