a variant of return-to-libc is return-oriented programming (rop), which sets up a series of return addresses, each of which executes a small sequence of cherry-picked machine instructions within the existing program code or system libraries, sequence which ends with a return. these so-called "gadgets" each accomplish some simple register manipulation or similar execution before returning, and stringing them together achieves the attacker's ends. it is even possible to use "returnless" return-oriented programming by exploiting instructions or groups of instructions that behave much like a return instruction.