Как определить, включена ли защита разбивки стека в приложении 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. К сожалению, это плохо документировано.

Для того, чтобы проверить, что вы можете посмотреть сборку, сгенерированную с помощью и без опции, как предложено в другом ответе, или просто сначала сравните сгенерированный размер двоичных файлов.