ret2win | no-PIE or known win target | immediate control-flow win | still great, but mostly a stage-zero luxury |
ret2plt leak | imported print/write primitive exists | libc or code leak | default stage one on ELF |
ret2libc | libc base known or leakable | system, execve, ORW, mprotect | still the Linux baseline when backward-edge CFI is absent |
ret2dlresolve | dynamic ELF + writable staging | resolve symbol without libc base | strong when leaks are constrained |
ret2csu | gadget-poor ELF | helper multi-register call setup | helper, not final trophy |
| SROP | sigreturn path + register starvation | one-frame register control | excellent when syscall setup is the real problem |
| saved frame-pointer pivot | off-by-one or short overwrite | move stack into BSS/heap/attacker buffer | often more realistic than RIP-first thinking |
| partial return overwrite | same-page code targets | ASLR-light pivot or function replay | low-byte wins matter |
| BSS / heap pivot | first bug too short for final chain | larger stage-two workspace | prefer the shortest stable second-input route |
| JOP/COP/COOP | CET / CFG / PAC-era targets | valid-target code reuse without raw ret abuse | more current than forcing ROP through hostile CFI |
| data-only stack corruption | canaries or shadow stacks block control hijack | auth bypass, length/path/callback corruption | often the right hardened-target ending |
| legacy SEH overwrite | 32-bit legacy Windows only | exception redirection | historical branch, not modern default |