Newer
Older
Hardware / FaultInjection / examples / CuriousBolt / Level-1 / tidy_log.py
root on 3 May 1 KB Chall 4 extras added
  1. import argparse
  2. import re
  3. import struct
  4.  
  5. def parse_line(line):
  6. match = re.match(r'^\[([0-9A-Fa-f]{8})\]: ((?:[0-9A-Fa-f]{8} ){7}[0-9A-Fa-f]{8})$', line.strip())
  7. if not match:
  8. return None
  9. address_str, data_str = match.groups()
  10. address = int(address_str, 16)
  11. words = [int(w, 16) for w in data_str.strip().split()]
  12. return address, words
  13.  
  14. def main():
  15. parser = argparse.ArgumentParser(description='Convert hex dump format to raw binary for Ghidra.')
  16. parser.add_argument('-i', '--input', required=True, help='Input .hex-style file')
  17. parser.add_argument('-o', '--output', required=True, help='Output binary file')
  18. parser.add_argument('--base', type=lambda x: int(x, 16), default=None,
  19. help='Optional: base address override (hex, e.g. 0x08000000)')
  20. args = parser.parse_args()
  21.  
  22. memory = {}
  23. min_address = None
  24. max_address = None
  25.  
  26. with open(args.input, 'r') as infile:
  27. for line in infile:
  28. parsed = parse_line(line)
  29. if parsed is None:
  30. continue
  31. address, words = parsed
  32. for i, word in enumerate(words):
  33. addr = address + i * 4
  34. memory[addr] = word
  35. if min_address is None or addr < min_address:
  36. min_address = addr
  37. if max_address is None or addr > max_address:
  38. max_address = addr
  39.  
  40. if args.base:
  41. min_address = args.base
  42.  
  43. with open(args.output, 'wb') as outfile:
  44. addr = min_address
  45. while addr <= max_address:
  46. word = memory.get(addr, 0)
  47. outfile.write(struct.pack('<I', word)) # little-endian
  48. addr += 4
  49.  
  50. if __name__ == '__main__':
  51. main()
Buy Me A Coffee