[FAQ14383]如何在内核打开栈保护功能?
来源:互联网 发布:淘宝美妆 编辑:程序博客网 时间:2024/05/22 13:45
[DESCRIPTION]
内存踩坏一般都很难排查问题,需要借助各种调试方法找出问题点。不同的内存踩坏有不同的调试方法,这里介绍下内存踩坏中的一种:栈帧溢出。
栈帧溢出是指:在某个函数内踩坏了不属于该函数的栈帧。举例:
[C/C++]hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void
a(
void
)
{
int
b[3],
int
i;
for
(i = 0; i <= 3; i++) {
b[i] = 0;
}
}
这里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
修改为:
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
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
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);
将
#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
将
ifndef CONFIG_CC_STACKPROTECTOR
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
endif
修改为:
KBUILD_CFLAGS += -fstack-protector-all
0 0
- [FAQ14383]如何在内核打开栈保护功能?
- 防火墙如何实现保护功能
- 内核栈溢出保护
- 如何打开UPnP功能
- 如何打开受保护的WORD文件
- X86内核启动分析四 打开保护模式之门
- 在 Word 2002 和 Word 2003 中如何使用“打开并修复”功能打开文档
- 如何关闭系统文件保护功能
- 如何关闭WINDOWS2003 DEP数据保护功能
- 如何打开USB OTG功能
- 如何在asp.net保护文件
- 如何在asp.net保护文件
- 如何在SQL注入时保护数据库
- 如何在SQL注入时保护数据库
- 如何在emacs中打开shell模式时实现shell命令记忆功能
- 如何在设置中默认打开EPO,AGPS功能以提高用户体验
- CentOS 7 在SELinux保护下安全打开端口
- 内核模块中如何打开文件?
- [FAQ14614]如何用MMU保护buddy system?
- Codevs 1260 快餐问题
- 如何绕过清单文件,动态注入activity
- 第四章 作业4
- K-th Number(poj2104)线段树维护区间+平方分割+二分搜索
- [FAQ14383]如何在内核打开栈保护功能?
- kafka安装部署
- android view 的移动的几种方式
- datetimepicker选择日期后事件
- tomcat中同时部署两个项目的问题
- 第四章 上机4
- HTML笔记(二)
- sip服务器判断同一个transaction条件
- python 里面的单下划线与双下划线的区别(私有和保护)