Разве канарейка делает подобные атаки невозможными?Это затрудняет выполнение return-to-libc или ROP, но это определенно не серебряная пуля против таких атак.
Прежде всего, канарейки стека защищают только от разрушения адреса возврата через переполнение буфера.Но есть и другие способы повредить память: косвенная перезапись указателя * уязвимости форматной строки или для имени два.
Во-вторых, канарейки стека можно обойти, переписав их с помощьюпервоначальная стоимостьЯ не говорю, что это легко в современных реализациях, но это, конечно, не невозможно .
В-третьих, хотя атаки называются return -to-libc и Возврат Ориентированное программирование, кто сказал, что нам нужны инструкции по возврату для осуществления этих атак?Эти атаки могут быть инициированы повреждением любой области памяти, из которой будет загружен процессор, и адреса, к которому нужно перейти.Наиболее распространенный пример - указатель на функцию.Но мы также можем перезаписать буферы GOT или longjmp
.(Как примечание стороны, было показано, что ROP может быть выполнен без использования любых инструкций возврата !)
Четвертая причина - не слабость стека канареекСам по себе, но одна из большинства реализаций.Канарские стеки, как правило, помещаются только в функции, которые имеют в стеке символьный буфер размером не менее 8. Следовательно, эти реализации не будут обнаруживать переполнения в других буферах. Этот эксплойт использовал переполнение в целочисленном массиве, поэтому он не мог быть обнаружен канарейками стека.