软件安全逆向——软件漏洞
软件漏洞
可了解
攻击虚函数
虚函数指针保存在对象的内存空间中,紧接着的是其他成员变量。虚函数表保存在静态数据区,其入口地址(虚函数指针)被统一存放在虚函数表中。其代码存在代码区。
虚函数表与类对应,相同类的不同对象的虚函数指针指向相同的虚函数表
对象使用虚函数时先通过虚函数表指针找到虚函数表,然后从虚函数表中取出虚函数指针,之后利用指针去调用代码
若虚函数表里存储的虚函数指针被篡改,程序调用虚函数的时候就会执行篡改后指定地址的恶意代码,即虚函数攻击
权限类漏洞(权限提升)
分为水平越权和垂直越权
水平越权:相同级别的用户或同一角色的不同用户之间可以越权访问、修改或删除的非法操作;
垂直越权分为向上越权和向下越权;向上越权即低权限用户或无权限用户可做与高权限用户相同的事情;向下越权即高级别用户可以访问一个低级别的用户信息
需掌握
整数溢出漏洞
一般用于绕过目标程序的条件检测以实现其他攻击,当malloc计算size时若发生整数溢出则会分配大小为0的内存块,使得后续执行会发生堆溢出。
- 存储溢出:使用另外的数据类型来存储整型数
- 运算溢出:对整型变量进行运算时没有考虑边界范围,造成运算后数值范围超出存储空间
- 符号问题:整型数可分为有符号数和无符号数,在开发过程中一般长度变量使用无符号数,但若忽略符号,在进行安全检查时则可能报错
【实验实现】
对于一个char[2000]的,用记事本输入29999个非空格字符(会有结束符’\0’自动补充),再输入一个空格字符(分割两个字符串),再输入2769个非空字符(因为要造成short溢出)保存为”input.txt”
1 | int func1(){} |
用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 |
|
在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,更危险,利用其可写入某内存地址任意数据
第六章 结
