Protection from Within: Runtime Hardening Techniques for COTS Binaries