赞
踩
软件不安全性的两种表现
软件不安全的原因
共同的基本原因:软件在设计、编码、测试和运行阶段,没有发现软件中的各种安全隐患,导致软件的不安全。
(1)软件的生产没有严格遵守软件工程流程。
(2)大多数系统软件和商业软件结构庞大且复杂,无法持续安全运行
(3)编码者没有采用科学的编码方法。
(4)测试不到位(不过有时是无法到位)。主要是测试用例的设计无法涵盖尽可能典型的安全问题。
错误与缺陷
错误是指软件实现过程出现的问题,大多数的错误可以很容易发现并修复,如缓冲区溢出、死锁、不安全的系统调用、不完整的输入检测机制和不完善的数据保护措施等;
缺陷是一个更深层次的问题,它往往产生于设计阶段并在代码中实例化且难于发现,如设计期间的功能划分问题等,这种问题带来的危害更大,但是不属于编程的范畴。
软件安全防护手段
安全设计与开发:SDL
保障运行环境:保障软件自身运行环境,加强系统自身的数据完整性校验
加强软件自身行为认证:软件动态可信认证在确保软件数据完整性的前提下,如何确保软件的行为总是以预期的方式,朝着预期的目标运行。
恶意软件检测与查杀:通常采用病毒特征值检测、虚拟机、启发式扫描、主动防御、云查杀等等几种方法来对病毒进行检测。
黑客攻击防护:防火墙,入侵检测系统IDS,入侵防护系统IPS,基于主机的漏洞攻击阻断技术
系统还原:将关键系统文件或指定磁盘分区还原为之前的备份状态,从而将已有系统中的恶意程序全部清除,以保护系统安全。
虚拟隔离:虚拟机(如VMware),沙箱,也叫沙盘或沙盒(如SandBox)
xchg:让两个寄存器或内存单元的值互换,而无需使用其他寄存器或内存来进行传递。
汇编求补指令neg 汇编dec(减1)实例加解析 汇编inc(加1)实例加解析
ror/rol:将某个二进制数字进行指定位数的移位,并将移出的位重新放置到高位或低位。ROL指令向左循环移位,ROR指令向右循环移位。
scas:用于在字符串比较时执行比较和交换操作。
jcc(Jump if Condition is met):条件转移指令
CLI(Clear Interrupt Flag):用于清除中断标志位,禁用中断。
CLD (Clear Direction Flag):CLD指令用于清除方向标志位。方向标志位影响一些字符串处理指令的方向,CLD确保这些指令向前移动,而不是向后。
STD (Set Direction Flag):STD指令用于设置方向标志位。与CLD相反,STD会设置方向标志,影响一些字符串处理指令的方向,使其向后移动。
STI (Set Interrupt Flag):STI指令用于设置中断标志位,启用中断。执行这个指令后,CPU将允许中断请求,并在中断到达时响应。
大端存储:指数据的低位保存在内存的高地址中,数据的高位保存在 内存的低地址中。
小端存储:指数据的低位保存在内存的低地址中, 数据的高位保存在 内存的高地址中
(年年考,年年忘)
功能:加载操作系统引导程序,如Windows XP系统的NTLDR
二者区别:程序头表主要用于描述程序的总体信息,而节头表则用于描述程序中各个节的属性和位置信息。
按照漏洞威胁分类:获取访问权限漏洞,权限提升漏洞,拒绝服务漏洞,恶意软件植入漏洞,数据丢失或者泄露漏洞
按照漏洞成因:输入验证错误,访问验证错误,竞争条件,意外情况处置错误,设计错误,配置错误,环境错误
按照漏洞严重性:
A类漏洞(高):威胁性最大的漏洞,往往由较差的系统管理或错误设置造成。
B类漏洞(中):较为严重的漏洞,例如允许本地用户获得增加的和未授权的访问。
C类漏洞(低):严重性不是很大的漏洞,例如允许拒绝服务的漏洞
按照漏洞被利用的方式:本地攻击,远程主动攻击,远程被动攻击
内存安全漏洞:
网络安全漏洞:
这是一种被动式的攻击方式,因为它常常是将恶意代码嵌入到正常网页中,然后攻击者需要等待用户访问该网页从而触发漏洞被利用。
缓冲区漏洞:攻击完成必须有MemoryError,越界写操作或者越界读操作
注入类漏洞:攻击完成不需要任何MemoryError,攻击者诱导程序执行想要的,但是恶意的行为
空表:有128项,每项标识指定大小的空闲块。空闲块大小=索引项(ID)*8。Free[0]标识大于等于1024 Byte的空闲块。双向链表。
快表:128项,采用单项链表,链中的堆从不发生合并,每项最多4个节点
堆块:块首+块身。
块首:头部8个字节,用来标识自身信息(如大小,空闲还是占有等)
块身:数据存储区域,紧跟块首。
- int main()
- {
- char a = -1;
- unsigned char b = a;
-
- int n = (int)a;
- printf("%d \n", n); //程序输出-1
- n = (int)b;
- printf("%d \n", n); //程序输出255
- }
- //解释 :把a赋值给b的时候,b成了255,因为b没有符号位。
格式化字符串函数(printf)的栈结构图:
产生原因:
*printf()是不定参数输入 ,*printf()不会检查输入参数的个数
可以进行信息泄露的格式化:“%s %d %x …”
关键受攻击的格式化:“%n”。简单来说,%n 是将当前 printf 已打印的字符数写入一个 指定的变量
防御措施:
格式化串溢出通过静态扫描较容易发现;部分编译器已经可以限制部分格式化字符串问题。
漏洞被发现--T0,漏洞信息公布--T1,漏洞被修复--T2。
Exploit 约等于 Payload + Shellcode
Payload部署基本的数据(用于漏洞的触发),携带Shellcode
因此,Payload与漏洞关联,Shellcode独立于漏洞
利用目标:
利用过程:
特点:长度受限,不能使用特定字符(例如\x00等),API函数自搜索和重定位能力(由于shellcode没有PE头,因此shellcode中使用的API和数据必须由shellcode自己进行搜索和重定位),一定的兼容性(为了支持更多的操作系统平台,shellcode需要具有一定的兼容性)
核心思想:将内存分块后,设置不同的保护标志,代码区块拥有执行权限,而数据的区块仅有读写权限,进而控制数据区域内的shellcode无法执行。
DEP保护可以有效地防止缓冲区溢出攻击,从而提高计算机系统的安全性。在Windows系统中,DEP是默认启用的安全功能之一。启用DEP后,操作系统会阻止应用程序在非执行内存页中执行代码,从而防止攻击者利用缓冲区溢出漏洞执行恶意代码。
ASCII armoring:想办法让libc所有函数的地址都包含一个零字节,让strcpy拷贝函数在遇到零地址时结束拷贝,攻击失败!
比如:RIPS,Fortify SCA,VCG(VisualCodeGrepper),Findbugs-Java Bug pattern
分析方法有动态切片和污点传播。(要不实践试一下?)
动态分析工具:MEMcheck,BitBlaze,Fuzzing
具体工作机制:在函数开始时往栈中压入一个可以检验的随机数,在函数结束时验证栈中的随机数是否一致。
-D_FORIFY_SOURCE=1时,开启缓冲区溢出攻击检查;
-D_FORIFY_SOURCE=2时,开启缓冲区溢出以及格式化字符串攻击检查。
PIE是一种可执行文件格式,它使得程序在内存中的位置无关,从而增加了攻击者利用缓冲区溢出等漏洞的难度。而ASLR是一种系统级别的安全机制,它通过随机化进程的地址空间布局来防止攻击者预测目标地址,进一步增强了系统的安全性。
在Linux系统中,PIE是ASLR的一部分。当一个程序被标记为PIE时,它会在运行时被加载到随机地址,使得攻击者难以找到目标地址。同时,ASLR还涉及到对堆、栈、共享库映射等线性区布局的随机化,进一步增加了攻击者预测目的地址的难度。
因此,PIE和ASLR是相互关联的安全技术,它们共同提高了软件的安全性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。