[FAQ14383]如何在内核打开栈保护功能?
2016-10-14 16:54
197 查看
[DESCRIPTION]
内存踩坏一般都很难排查问题,需要借助各种调试方法找出问题点。不同的内存踩坏有不同的调试方法,这里介绍下内存踩坏中的一种:栈帧溢出。
栈帧溢出是指:在某个函数内踩坏了不属于该函数的栈帧。举例:
[C/C++]hide
这里b只有3个int长度,但是却循环4次,将不属于b的内存踩坏,而b在a函数的栈帧里,这种情形叫栈帧溢出。
针对这种的调试方法需要借助gcc编译器的功能:stack-protector。原理是在函数栈帧前埋一个守卫,在函数退出时检查该守卫是否被踩坏,如果有则发生了栈帧溢出。
守卫的值会从__stack_chk_guard里获取,检查失败会调用__stack_chk_fail()函数。详情请搜索GCC说明文档。
这种方法虽然无法100%抓到问题点,但绝对是非常有效的防护措施,以下介绍打开方法。
[SOLUTION]
ARM32 AOSP版本:
1. 在alps/kernel-3.10/arch/arm/configs/$proj_defconfig或alps/kernel-3.10/arch/arm/configs/$proj_debug_defconfig
将:
# CONFIG_CC_STACKPROTECTOR is not set
修改为:
CONFIG_CC_STACKPROTECTOR=y
2. 在alps/kernel-3.10/arch/arm/Makefile
将
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
KBUILD_CFLAGS+=-fstack-protector
endif
修改为:
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
KBUILD_CFLAGS+=-fstack-protector-all
endif
3. 在alps/kernel-3.10/arch/arm/boot/compressed/Makefile添加:
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -fstack-protector-all, , $(ORIG_CFLAGS))
endif
ARM64 AOSP版本:
ARM64版本暂不支持该功能,因此需要自己添加代码:
1. 在alps/kernel-3.10/kernel/panic.c
将
#ifdef CONFIG_CC_STACKPROTECTOR
修改为
#if 1
const unsigned long __stack_chk_guard __read_mostly = 0xA5A5A5A5A5A5A5A5;
EXPORT_SYMBOL(__stack_chk_guard);
2. 在kernel-3.10/Makefile
将
ifndef CONFIG_CC_STACKPROTECTOR
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
endif
修改为:
KBUILD_CFLAGS += -fstack-protector-all
内存踩坏一般都很难排查问题,需要借助各种调试方法找出问题点。不同的内存踩坏有不同的调试方法,这里介绍下内存踩坏中的一种:栈帧溢出。
栈帧溢出是指:在某个函数内踩坏了不属于该函数的栈帧。举例:
[C/C++]hide
针对这种的调试方法需要借助gcc编译器的功能:stack-protector。原理是在函数栈帧前埋一个守卫,在函数退出时检查该守卫是否被踩坏,如果有则发生了栈帧溢出。
守卫的值会从__stack_chk_guard里获取,检查失败会调用__stack_chk_fail()函数。详情请搜索GCC说明文档。
这种方法虽然无法100%抓到问题点,但绝对是非常有效的防护措施,以下介绍打开方法。
[SOLUTION]
ARM32 AOSP版本:
1. 在alps/kernel-3.10/arch/arm/configs/$proj_defconfig或alps/kernel-3.10/arch/arm/configs/$proj_debug_defconfig
将:
# CONFIG_CC_STACKPROTECTOR is not set
修改为:
CONFIG_CC_STACKPROTECTOR=y
2. 在alps/kernel-3.10/arch/arm/Makefile
将
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
KBUILD_CFLAGS+=-fstack-protector
endif
修改为:
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
KBUILD_CFLAGS+=-fstack-protector-all
endif
3. 在alps/kernel-3.10/arch/arm/boot/compressed/Makefile添加:
ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -fstack-protector-all, , $(ORIG_CFLAGS))
endif
ARM64 AOSP版本:
ARM64版本暂不支持该功能,因此需要自己添加代码:
1. 在alps/kernel-3.10/kernel/panic.c
将
#ifdef CONFIG_CC_STACKPROTECTOR
修改为
#if 1
const unsigned long __stack_chk_guard __read_mostly = 0xA5A5A5A5A5A5A5A5;
EXPORT_SYMBOL(__stack_chk_guard);
2. 在kernel-3.10/Makefile
将
ifndef CONFIG_CC_STACKPROTECTOR
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
endif
修改为:
KBUILD_CFLAGS += -fstack-protector-all
相关文章推荐
- 在编辑状态下变量或函数不能显示提示时如何打开提示功能(或编程助手)
- 教你如何打开ADSL Modem的路由功能
- 如何从内核模式设备驱动程序中打开一个文件以及如何读取或写入文件(来自微软官网)
- 如何关闭和打开oracle 10g自动收集统计信息功能
- 【转帖】如何从内核模式设备驱动程序中打开一个文件以及如何读取或写入文件
- 如何打开自动补齐功能
- 如何从内核模式设备驱动程序中打开文件以及如何读取或写入文件
- 如何利用Windows自带功能保护私密信息
- apache禁止列目录:apache如何打开或者关闭列目录功能
- 如何关闭系统文件保护功能
- 如何保护发行的软件中Access数据库不被别人打开
- Windows 2000如何打开自动补齐功能
- 内核模块中如何打开文件?
- 如何关闭Win XP SP2中的数据执行保护(DEP)功能
- 如何保护发行的软件中Access数据库不被别人打开
- 如何关闭WINDOWS2003 DEP数据保护功能
- 如何设置和打开Win7移动中心 Win7移动中心功能详解
- 如何实现VB中打开图像文件时的预览功能
- 在 Word 2002 和 Word 2003 中如何使用“打开并修复”功能打开文档
- ISE中的Force Process Up-to-Date功能:ISE中如何在未综合实现的前提下打开ChipScope ?