tl;dr
- The VM takes a custom binary as input
- Binary contains function table, code and bss sections
- Code can overlap with bss and be modified at runtime
- The JIT compiler assumes that a function is safe since it ran many times
- Functions modified right before JIT bypass security checks