如何在纯swift应用程序中启用Stack Smashing Protection?
我确实尝试将“-fstack-protector-all”标志放在xCode中项目构建设置选项卡下的其他C ++标志中,但似乎这个标志未使用或对构建的应用程序没有影响。
要验证构建我正在使用otool -Iv AppBinary | grep stack
。
答案 0 :(得分:6)
在Swift中,默认情况下启用堆栈粉碎只需要在objective-c应用程序的构建设置下添加“-fstack-protector-all”标志。
如何检查是否已启用堆栈粉碎。
运行otool命令并显示stack_chk_guard
和stack_chk_fail
表示代码被堆栈粉碎保护。
$ otool -Iv <appname>|grep stack
0x0013dfg 520 ___stack_chk_fail
0x001d009 521 ___stack_chk_guard
0x001fd345 520 ___stack_chk_fail
0x000000010087efd 513 ___stack_chk_fail
0x0000000100098hf3 514 ___stack_chk_guard
0x00000001000897gfr 513 ___stack_chk_fail
答案 1 :(得分:1)
我在100%Swift项目中也遇到了这个问题。
每当我将-fstack-protector-all
添加到“ Other C-Flags”构建设置中时,标志就不会按照其他注释中的描述显示在二进制文件中。
我所做的是创建一个Objective-C类……
// DummyClassForSSP.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface DummyClassForSSP : NSObject
+ (void)dummyCallSoFlagsShowUpInIPA;
@end
NS_ASSUME_NONNULL_END
...添加了一个虚拟实现...
// DummyClassForSSP.m
#import "DummyClassForSSP.h"
@implementation DummyClassForSSP
+ (void)dummyCallSoFlagsShowUpInIPA {}
@end
…并从我的AppDelegate中调用了它。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
....
DummyClassForSSP.dummyCallSoFlagsShowUpInIPA()
...
}
此后,标志按照说明出现。
答案 2 :(得分:0)
聚会晚了一点,但可能有助于其他人的寻求建议: 乔的答案不正确。 -fstack-protector-all是GCC编译器上的标志。 (此处的文档:https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html)
对于快速应用程序,此处不涉及GCC编译器。而是具有不同选项和设置的swiftc编译器。 las,我不知道后者的类似选择。
按照@btype的建议在项目中添加一个Objective-c类,对您的快速源代码无济于事,因为它只会影响Obj-C和C代码。 但是,如果您使用用Obj-C编写的第三方库,那么它仍然是一个有价值的设置。但是请确保,如果将第三方库嵌入为单独的目标,则在正确的目标上设置此标志。
干杯,克里斯