Как определить, включена ли защита разбивки стека в приложении iOS
Я хочу проверить, включена ли защита разбивки на стек (-fstack-protector-all) в приложении iOS, построенном на Xcode 9, с целью iOS 11.
Я создал приложение с защитой -fstack-protector - все включено в "Other C flags", и оно выполняется и запускается, но как я могу проверить, включена ли защита разбивки стека?
Есть много старых (2013 и более ранних) ресурсов, в которых упоминается otool -Iv appName |grep stack_chk
, но я запустил это в своем бинарном приложении, а stack_chk нигде не было найдено в выводе.
Есть ли современный эквивалент этой команды? Is -fstack-protector-все еще нужно больше, учитывая текущий набор значений по умолчанию в Xcode?
Ответы
Ответ 1
Вы можете проверить сгенерированный код самостоятельно. Компилируйте с защитой и без нее, затем посмотрите на дизассемблированный код (для XCode вы можете использовать: Открыть разборку в XCode 4 (или Xcode 5 или Xcode 6) или просто использовать ваш любимый дизассемблер).
Образцы сгенерированного кода в обоих случаях можно найти здесь: https://security.stackexchange.com/questions/158609/how-is-the-stack-protection-enforced-in-a-binary?newreg=af786a3bcdc841e1b92110299a2951af
И последнее, но не менее важное: попробуйте написать небольшой собственный тест, который пытается испортить стек. Как только вы сможете разбить стек, включите флаг защиты, перестройте и посмотрите, имеет ли он эффект. Здесь можно найти тривиальные примеры: https://en.wikipedia.org/wiki/Stack_buffer_overflow
Ответ 2
-fstack-protector-all
является допустимым вариантом для компилятора llvm, используемого в Xcode, см., например, http://lists.llvm.org/pipermail/cfe-dev/2017-April/053662.html. К сожалению, это плохо документировано.
Для того, чтобы проверить, что вы можете посмотреть сборку, сгенерированную с помощью и без опции, как предложено в другом ответе, или просто сначала сравните сгенерированный размер двоичных файлов.