1.什么是安全漏洞

漏洞是指计算机系统在硬件,软件,协议的具体实现和系统安全策略存在的缺陷和不足,使得攻击者可以在未授权的情况下访问或破坏系统
计算机系统安全包括开发和配置两个方面
安全漏洞的危害:

  1. 对系统的威胁
  2. 非法获取访问权限
  3. 权限提升
  4. 拒绝访问
  5. 恶意软件植入
  6. 数据丢失或泄露

2.什么是安全编程

安全编程是指在编写程序的过程中,为了保证程序的安全性和可靠性,采取的一系列措施和技术手段用来预防和应对潜在的安全风险和威胁,它是一种以安全为目的的编写方法,旨在减少程序漏洞,防止被攻击和利用。

  1. 安全编程的核心目标是保护系统的机密性完整性可用性
  2. 安全编程是以一系列技术手段来保障系统的安全性
  3. 安全编程需要遵循一定的编程规范和最佳实践

3.整数安全漏洞

整数安全漏洞是指对整数操作时产生了超过该类型所能表示的范围的数值,引起数据失真,通常有三种情形:回绕,溢出,截断

  1. 回绕是指整数表示范围的上界和下界形成闭环
  2. 溢出是指有符号整形超出该类型所能表示范围
  3. 截断是指将宽度较大的整数存入宽度较小的操作数时,高位数据被丢弃

4.避免整数安全漏洞

  1. 改变运算手段
  2. 使用较大范围类型表示操作数
  3. 使用测试手段保证安全运算

5.缓冲区溢出漏洞

缓冲区是用来存放程序运行时所产生的临时数据,其内存地址连续且大小有限,根据分配方式和使用目的,可分为栈缓冲区和堆缓冲区,栈缓冲区存放的是临时变量和函数参数,堆缓冲区存放的是动态开辟释放的内存。
程序在处理数据时,若未能对数据大小或字符串长度进行适当的限制在进行赋值复制填充时没有对数据限定边界,导致数据长度大小超过了缓冲区的大小,就会导致内存中一些关键数据被覆盖,或者说当向某特定数据分配的内存区域以外写入数据时,就会发生缓冲区溢出

6.栈缓冲区溢出原理

栈是一种先进后出或后进先出的数据结构,有入栈,出栈,栈顶,栈底,ESP,EBP等内容
c语言是函数式语言,在编译运行时,为每个函数调用分配了一个栈帧,每个栈帧都是独立的栈结构,通常把所有函数调用栈帧的集合称为系统栈
栈帧的生长方向是由高地址向低地址,而局部数组的生长方向是由低地址向高地址,由于栈帧的空间有限,如果将数据复制到局部数组缓冲区中就有可能超出缓冲区区域,导致高地址数据被覆盖。

  1. 覆盖了其他局部变量
  2. 覆盖了上一栈帧的EBP值,导致栈帧失去平衡
  3. 覆盖了返回地址,导致代码执行意外的流程
  4. 覆盖了参数变量,影响当前函数结果
  5. 覆盖了上一函数的栈帧,影响上一函数流程

7.缓冲区溢出的利用

缓冲区溢出会使程序崩溃,但要执行任意代码,还需完成一下两点

  1. 在程序的地址空间安排适当的代码,达到目的
    1. 植入法
    2. 利用已存在的代码
  2. 控制程序跳转到第一步所安排的代码
    1. 覆盖返回地址
    2. 覆盖对象指针或函数
    3. 覆盖SHE链表

8.栈溢出的防范

  1. 编程时注意缓冲区的边界
  2. 不使用strcpy,memcpy等不安全的函数
  3. 在编译器中加入边界检查
  4. 在使用栈中重要数据之前加入检查,如Security Cookie技术

9.数据安全问题的防范

  1. 指定和检查数组元素下标的上下边界
  2. 使用安全函数