Linux内核栈破坏示例代码
给一个Linux内核栈被破坏的示例
Linux 内核栈破坏示例
以下是一个通过内核模块故意破坏内核栈的示例。该模块通过缓冲区溢出覆盖栈上的关键数据(如返回地址),导致内核崩溃(Kernel Panic)。
代码示例 (stack_corrupt.c
)
1 |
|
关键点解析
缓冲区溢出:
small_buffer
只分配了 16 字节。memset(small_buffer, 0xAA, 256)
写入 256 字节,覆盖栈上的:- 函数返回地址
- 栈帧指针
- 其他局部变量
后果:
- 当
corrupt_stack()
返回时,CPU 尝试跳转到无效地址 (0xAAAAAAAA
)。 - 触发 **内核恐慌 (Kernel Panic)**,系统崩溃。
- 日志中会出现错误(如
"general protection fault"
或"invalid opcode"
)。
- 当
如何测试
编译模块:
1
make -C /lib/modules/$(uname -r)/build M=$PWD modules
加载模块(导致崩溃):
1
sudo insmod stack_corrupt.ko
查看内核日志(崩溃前):
1
dmesg | tail
输出示例:
1
2
3[ 1234.567890] 加载栈破坏模块
[ 1234.567891] 准备破坏内核栈...
[ 1234.567892] 内核崩溃信息...
常见栈破坏原因
内核缓冲区溢出:
- 未检查用户空间复制操作(如
copy_from_user()
)。 - 错误的数组索引或指针运算。
- 未检查用户空间复制操作(如
递归过深:
- 无限递归耗尽内核栈(通常 8-16 KB)。
野指针操作:
- 访问已释放的内存或无效指针。
调试建议
KASAN (Kernel Address Sanitizer):
- 检测内存越界访问(需开启内核编译选项)。
Oops 分析:
- 通过
dmesg
查看崩溃时的寄存器状态和调用栈。
- 通过
栈保护机制:
CONFIG_STACKPROTECTOR
:内核栈 Canary 值保护。CONFIG_FRAME_POINTER
:保留帧指针用于回溯。
警告:此示例会立即导致系统崩溃!仅在测试环境使用。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!