软件漏洞

可了解

攻击虚函数

虚函数指针保存在对象的内存空间中,紧接着的是其他成员变量。虚函数表保存在静态数据区,其入口地址(虚函数指针)被统一存放在虚函数表中。其代码存在代码区。

虚函数表与类对应,相同类的不同对象的虚函数指针指向相同的虚函数表

对象使用虚函数时先通过虚函数表指针找到虚函数表,然后从虚函数表中取出虚函数指针,之后利用指针去调用代码

若虚函数表里存储的虚函数指针被篡改,程序调用虚函数的时候就会执行篡改后指定地址的恶意代码,即虚函数攻击

权限类漏洞(权限提升)

分为水平越权和垂直越权

水平越权:相同级别的用户或同一角色的不同用户之间可以越权访问、修改或删除的非法操作;

垂直越权分为向上越权和向下越权;向上越权即低权限用户或无权限用户可做与高权限用户相同的事情;向下越权即高级别用户可以访问一个低级别的用户信息

需掌握

整数溢出漏洞

一般用于绕过目标程序的条件检测以实现其他攻击,当malloc计算size时若发生整数溢出则会分配大小为0的内存块,使得后续执行会发生堆溢出。

  • 存储溢出:使用另外的数据类型来存储整型数
  • 运算溢出:对整型变量进行运算时没有考虑边界范围,造成运算后数值范围超出存储空间
  • 符号问题:整型数可分为有符号数和无符号数,在开发过程中一般长度变量使用无符号数,但若忽略符号,在进行安全检查时则可能报错

【实验实现】

对于一个char[2000]的,用记事本输入29999个非空格字符(会有结束符’\0’自动补充),再输入一个空格字符(分割两个字符串),再输入2769个非空字符(因为要造成short溢出)保存为”input.txt”

1
2
3
4
5
6
7
8
9
10
11
int func1(){}
...
char info[MAX_INFO];
char info1[30000];
char info2[30000];
freopen("input.txt","r",stdin);
...
short all_len = len1+len2;
...
func2();
...

用x32dbg找到func1函数的地址(如0x00412702),则用HxD打开input.txt,末尾输入”02 27 41 00 “并保存

这样空格前的29999个字符会存入到info1,空格后的2769个字符存入info2,此时超出short型最大范围(-32768 ~ 32767),造成溢出,此时溢出的4字节正好覆盖掉原func2的地址,从而切换了调用。

格式化字符串漏洞

当格式化符号为%x或%p时以16进制输出栈内容;%s时输出对应地址所指向的字符串;

因此若不断增加%x或%p的个数就会逐渐显示栈中高地址的数据从而导致栈中的数据泄露

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(){
char str[200];
fgets(str,200,stdin);
printf(str);
return 0;
}
/*若编译后输入“AAAA%p%p%p%p%p”,则会输出"AAAA0019fe60000000c875dd02f00000000041414141",0x41就是A的值*/

在Relaese模式下观察栈结构:

Str Addr printf函数参数
Str Addr fgets函数参数
200d
Stdin Param
0
AAAA str数组
%p%p
%p%p

"AAAA%p%p%p%p%p"会被fgets存入栈上的str数组中,当printf解析完所有%p并打印完栈上的其他无关内存地址(EDI、ESI啥的),会继续沿着栈内存越界读取,连续的四个0x41在十六进制打印中就呈现为41414141。

格式化符号%n,更危险,利用其可写入某内存地址任意数据


第六章 结