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