Ъм, там пише че stack protection-ът им няма да сработи при експлойтване на return-into-libc принцип, демек там дето си тъпчеш в буфера нужните данни и презаписваш return адреса да сочи към някоя libc функция. Обаче ако се има предвид address space randomization-a, трябва да имаш много голям късмет, че да успееш да го експлойтнеш по този начин. Горе където пействах /proc/pid/maps се вижда, че libc се зарежда на различни (случайни) адреси в паметта на процеса, така че няма как да нацелиш това, с което да презапишеш стек пойнтера. В простият случай, който дадох, shellcode-а се намира на известно място, в стека, така че номера с JMP ESP opcode-а е ефективен. Но когато ролята на shellcode се играе от libc функция, която не знаеш къде се намира в паметта, този номер няма да мине.
Има нещо по-интересно обаче

'> Ако си забелязал, горе пак дето пействах maps се вижда, че регионите на паметта, където са мапнати библиотеки, код, стек и т.н. си имат позволения (read, write, execute и т.н.). Стекът (където ни се намира шелкода), както и 0xfffe777 където ни е JMP ESP нямат "execute" право, въпреки това инструкцията, както и шелкода се изпълняват. Това става, защото при x86 архитектури, "x" няма никакво значение (на разни RISC архитектури има). Обаче има разни пачове за ядрото, които все пак позволяват тези позволения на страниците в паметта да са ефективни и на x86, например PaX. Това си става за сметка на производителност, но рискът от всякакви атаки свързани с препълване на буфери, се намалява много брутално. Вероятно пак си е възможно да се направи нещо по въпроса, но сигурно изисква доста фантазия

'> освен като подход ще е валидно само за конкретната програма дето искаме да чупим.