def calculate_address(base_pc, auipc_offset, addi_offset): # Shift auipc_offset left by 12 (since it's upper bits) and add to base pc # Then add the addi_offset which includes lower 12 bits return base_pc + (auipc_offset << 12) + addi_offset def brute_force_base_address(auipc_offset, addi_offset, plausible_min, plausible_max): # Iterate over a range of possible base PC values # This range should be adjusted based on the expected memory layout of the target for base_pc in range(0x00000000, 0xffffffff, 0x10000): # example range, adjust as necessary address = calculate_address(base_pc, auipc_offset, addi_offset) if plausible_min <= address <= plausible_max: print(f"Possible base PC: 0x{base_pc:08X} results in valid address: 0x{address:08X}") # Example usage with hypothetical auipc and addi values auipc_value = 0xdfd5c # Example value from your setup addi_value = -0x506 # Negative because it's a two's complement negative offset # Define plausible memory range for valid addresses # These should be adjusted based on the memory layout of your hardware plausible_min_address = 0x00000000 plausible_max_address = 0xffffffff brute_force_base_address(auipc_value, addi_value, plausible_min_address, plausible_max_address)