第九章 计算机 软件 的安全 性

Post on 20-Mar-2016

114 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

DESCRIPTION

第九章 计算机 软件 的安全 性. 2001 年 10 月,在中国举行的 APEC 会议上,微软总裁比尔 . 盖茨说:“中国即将加入世界贸易组织,中国的企业需要依赖信息技术提高自身的效率和竞争力,这将带来巨大的应用软件需求。这给中国的软件产业既带来了挑战,也带来了机遇。中国信息产业尤其是软件产业的发展前景光明,我对此很有信心。软件产业创造了很大的就业机会,发展势头是可以预期的。”比尔 . 盖茨建议:对于中国来说,需要大力发展教育。“如果有更多的学生学习计算机,有更好的英语技能,中国信息产业的发展步伐会更快。”. 第九章 计算机 软件 的安全 性. 本章知识点: - PowerPoint PPT Presentation

TRANSCRIPT

第九章 计算机软件的安全性 2001 年 10 月,在中国举行的 APEC 会议上,微软总裁比尔 . 盖茨说:“中国即将加入世界贸易组织,中国的企业需要依赖信息技术提高自身的效率和竞争力,这将带来巨大的应用软件需求。这给中国的软件产业既带来了挑战,也带来了机遇。中国信息产业尤其是软件产业的发展前景光明,我对此很有信心。软件产业创造了很大的就业机会,发展势头是可以预期的。”比尔 . 盖茨建议:对于中国来说,需要大力发展教育。“如果有更多的学生学习计算机,有更好的英语技能,中国信息产业的发展步伐会更快。”

第九章 计算机软件的安全性本章知识点: 软件安全的概念 软件与程序的运行机制 软件自身安全 软件存储安全 软件通信安全 软件应用安全 软件运行安全 软件正确性与可信性 软件安全保护机制 软件防复制(存储访问技术) 软件防执行(运行控制技术) 软件防暴露(加密解密技术) 软件防篡改(完整可用技术)

第九章 计算机软件的安全性 软件的重要性:硬件是躯体,软件是灵魂!软件是信息化的灵魂!软件是各国、尤其是发达国家争夺科技主导权的制高点。软件是一种产品,软件是一种武器!软件产业是知识经济的核心。软件既可以用来攻击别人,也可以用来保护自己。软件主要指计算机系统中的程序 (源程序和执行程序 )以及程序运行所必须的数据和文档。

第九章 计算机软件的安全性 恶意攻击的主要目标:计算机系统 直接的重点目标:信息和数据,以及包含、记录和 存储这些信息数据的软件 (程序 )。 软件的丢失、篡改、窃取、非法复制、滥用等对系统造成的后果是灾难性的,对社会造成的影响可以是严重和深远的。 网络、通信和信息处理的推广普及,系统开放式结构设计,系统连接技术和协议公开化,形成一个社会各方与专业领域融合的大环境。各种大型应用软件、专用软件 (如金融财务软件、军用软件、统计规划软件、地理、气象、能源、航空航天软件等 )的使用,大型数据库的联网开放,都使软件和数据的重要性和地位日益

重要和不可缺少。

第九章 计算机软件的安全性 国民经济对软件和数据的依赖性日益严重,软件中任何一个小的纰漏、一种不完善的功能、一次微细的修改都可能对系统造成极大的影响。 有恶意企图的人、企图利用软件来达到非法目的的人视软件为一个攻击对象。 对软件的保护和对系统的保护一样至关重要、是十分迫切需要解决的问题。 软件安全保护保护什么? 软件生成的过程。 软件本身。 软件赖以生存的环境。 软件运行的条件。

第九章 计算机软件的安全性软件安全保护什么? 软件的完整性、可用性、保密性、 运行安全性。①软件自身安全 防止软件丢失、被破坏、被篡改、被伪造②软件存储安全 可靠存储,保密存储,压缩存储,备份存储③软件通信安全 安全传输、加密传输、网络安全下载、完整下载④软件使用安全 合法用户与非法用户,授权访问,防止软件滥用, 防止软件窃取,软件的非法复制⑤软件运行安全 确保软件正常运行,功能正常

第九章 计算机软件的安全性 一、软件与程序的运行机制 一个程序要运行,必须要有环境。 (对 Von Numan 存储程序式计算机来说) 程序代码(指令)有地方存放, 处理器能从这里取到, 指令能够按照顺序执行, 保存的程序和数据是完整的。

第九章 计算机软件的安全性 二、软件自身安全 软件自身的完整性是软件抵御外部攻击的能力。 自身安全的研究包括: 软件自身完整性:保证代码完整、数据完整和功能完整,而采用数据校验技术,程序自诊断、自保护技术,软件加密、软件压缩、软件运行控制技术等。 软件自身可信性:减少(或无)隐蔽通道、无程序陷阱 (trapdoor) ,无(或者减少) bug 。避免无效操作,死机和不可信调用。 隐蔽通道是指一个秘密的和未公开发表的进入软件模块的入口。这些入口可以是软件程序为了功能扩充而保留的程序接口;为软件测试而有意留下、但测试后又忘记删除的接口或入口;为今后软件维护而有意留下的程序入口;软件产品化后提供的公共调用入口等。

第九章 计算机软件的安全性 三、软件存储安全 软件和数据的宿主是各类存储介质 (磁盘、磁带、光盘等 ),对软件的访问、修改、复制等都需要经过存储介质和设备。存储设备的可

靠性、存储设备 (磁盘 ) 的加密解密、存储设备的访问控制等成为软件安全的重要问题。影响软件存储安全的两个重要因素是: 1 。存储介质(磁盘)的可靠性 2。文件系统的组织结构 3 。数据与文件的路由

第九章 计算机软件的安全性1 。存储介质(磁盘)的可靠性 磁盘是软件(程序)的载体,磁盘受损会影响到软件的存储与执行。 采用磁盘管理(程序)工具,可以有效地对磁盘进行操作,但是,也可以对磁盘进行伤害。磁盘工具的滥用,是一个潜在的危险。 注意:别有用心的人可以通过对磁盘进行直接读写而产生破坏。

第九章 计算机软件的安全性 1)磁盘基本配置参数 硬盘的主要工作参数 : 柱面 ( 磁道 ) 数: Cylinders (缩写 Cyl ) 磁头数: Heads (缩写 H ) 每道扇区数: Sectors per track (缩写 Sec ) 每扇区字节数: Bytes per sector (缩写 BpT ) 硬盘参数设置必须在使用前通过系统 setup配置 程序设置,并记录在 CMOS存储芯片中。

2 )硬盘容量计算 即 CHS模式( Cylinder, Head, Sector )计算: 柱面 磁头 扇区 字节 = 总容量 例: 柱面数 ( 1024) 磁头数 ( 16)

扇区数 ( 63)

字节数 ( 512)

= 总容量 528 Megabytes

第九章 计算机软件的安全性

系统对大容量硬盘的支持问题:1 ) DOS系统不能访问 2.1GB 的磁盘分区2 ) Windows 须借助 DM进行大分区3 ) 528MB限制: BIOS 和盘控制器( 94年)4 ) 4096Cyl限制: 4096Cyl(2.1GB),BIOS5 ) 8.4GB限制: BIOS,OS,FAT32支持 8.4GB 6 )速度限制: UltraDMA33 与 UltraDMA667 )交叉系数: Interleave 与格式化8 )格式化:不作低级格式化

第九章 计算机软件的安全性

为了正常使用 8.4GB以上的空间,在分区时应使用 WIN97以上版本的的 FDISK。并尽量使用 FAT32 格式。 WINDOWS NT4.0可以识别大于 8.4G的硬盘,但存在一些 BUG,而最新的 WINDOWS 2000可以完全正常支持大于 8.4G的硬盘。

硬盘容量限制问题是在 8.4GB的年代。我们知道硬盘的容量和扇区都是由三个数值决定,它们分别是柱面数( Cylinder )、磁头数( Head )、扇区数( Sector ),简称 CHS。操作系统访问硬盘需要通过 DOS 下的 INT13 API 接口,虽然硬盘的 CHS 寄存器是 28bit ,但是瓶颈在于 INT13 API的 C: 10bit; H: 8bit; S: 6bit ,这样能访问的最大容量也就是 210×28×( 26-1) =16515072个扇区,第一个扇区不能为 0,所以减去 1。每扇区是 512 字节,所以最大容量就是 8.46 GB(硬盘厂商都是以 1000为换算单位),这样就产生了 8.4 容量的限制。

在那之后 。。。 Windows 系统可以通过 32bit 的 Disk

Access 直接访问硬盘,这样瓶颈就转回了硬盘的 CHS 寄存器身上,一共 28bit 的 CHS 寄存器可寻址最大容量是 22

8-1 ,也就是 268435455 个扇区,每个扇区 512 字节,总容量就是 137.4GB ,这就是我们目前的硬盘容量限制。

現在 打破了这个限制,把 28bit 的 CHS 寄存器限制提升到了 48bit ,也就是 CHS 都是 16bit ,这样容量限制就是 144PB( 1PB=1,000,000GB ),但是我们到目前使用的操作系统都是 32bit 寻址,所以瓶颈在于操作系统了,不过即便是

32bit ,我们受到的限制也是 2199GB ,这足够我们今后很多年的发展了

3 )交叉系数: Interleave

12

交叉系数: 1:1

3

1211

4

567

10

9

8

15

9

128

2

6103

4

11

7

交叉系数: 1:4

第九章 计算机软件的安全性

4 )磁盘分区: Partition 磁盘在存储文件和数据之前必须进行分区,没有进行分区的磁盘不能进行格式化。 分区是形成磁盘记录结构的基础,格式化是按照文件系统的存取结构在磁盘上形成有关联的记录区。 分区容量的大小可由用户自行选择,但小容量分区和大容量分区需要分区程序的支持。

第九章 计算机软件的安全性

磁盘分区信息 MSDOS 和 Windows 操作系统磁盘分区信息记录在磁盘的主引导扇区中,位于磁盘的 0面 0道第一扇区。 共有四个磁盘分区信息表,地址位移为

第九章 计算机软件的安全性

01B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 0101C0 01 00 0B 3F 7F FB 3F 00-00 00 C1 40 1F 00 00 0001D0 41 FC 05 3F FF FD 00 41-1F 00 80 9F 1F 00 00 0001E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 0001F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA

第九章 计算机软件的安全性磁盘分区表

第一个分区表: 01BE----01CD

第二个分区表: 01CE----01DD

第三个分区表: 01DE----01ED

第四个分区表: 01EE----01FD

硬盘分区表,位于 1BEH - 1FDH处,每个分区表占用16个字节,共 4个分区表, 16个字节各字节意义如下:0:自举标志,80H为可引导分区,00为不可引导分区; 1~ 3:本分区在硬盘上的开始物理地址; 4:分区类型,其中 1 表示为 12 位 FAT表的基本 DOS分区;  4为 16位 FAT表的基本 DOS 分区; 5为扩展 DOS 分区; 6为大于 32M的 DOS 分区;  其它为非DOS分区。 5~ 7:本分区的结束地址; 8~ 11:该分区之前的扇区数,即此分区第一扇区的绝对扇区号; 12~ 15:该分区占用的总扇区数。    .

引导扇区的有效标志 ,位于 1FEH - 1FFH处 , 固定值为 AA55H。

硬盘分区是针对一个硬盘进行操作的,它可以分为:主分区、扩展分区、逻辑分区。其中主分区可以是 1-4个,扩展分区可以有 0-1个,逻辑分区则没有什么限制。它们的关系如下图所示:

主分区 主分区 主分区 扩展分区主分区 主分区 主分区 主分区主分区 主分区 逻辑分区逻辑分区逻辑分区

扩展分区

主分区 扩展分区

第九章 计算机软件的安全性 2。文件系统的组织结构 文件系统在磁盘上的结构是了解系统核心的关键,也是软件安全的基础。 每种操作系统的文件系统组织结构是不一样的,各自具有自己的特点,了解这种特点,就了解了存储在磁盘上的文件、数据等的访问方法,每一个系统管理员和网络管理员都必须了解文件系统组织结构及其在磁盘上的存储结构。 在流行操作系统中 MSDOS 、 Windows 、 UNIX 的文件系统在磁盘上的结构是保证安全的基础。

第九章 计算机软件的安全性 1 ) Windows文件系统的组织结构 Windows 文件系统( FAT16 )与 MSDOS具有类似的磁盘结构,包括: ( 1 )主引导扇区 ( 2 )次引导扇区 ( 3 )文件访问表( FAT表) ( 4 )文件目录结构

WIN95/98/ME 文件系统 硬盘区域的组织( FAT12/FAT16/FAT32) FAT16 分区 < 2GB 由 MBR( 虚拟 MBR)、 DBR、 FAT、 FDT、DATA 构成 FDT 定义了文件名、文件大小、文件存放的起始簇号 FAT是一个链表,定义文件的其他存放簇号和结束标志。

各区域的相互关系 硬盘启动:

由 BIOS 读入 MBR 的内容 然后调入活动分区的 DBR ,由 DBR 来引导系统 DBR 中除了引导程序部分,还有一个重要的 B

PB 表,操作系统靠 BPB 表参数来管理文件。

FAT16 分区B :每扇区字节数 512

D :每簇扇区数 4

E :保留扇区 1

10 : FAT 数 2

11 :引导记录 512

16 :每个 FAT 扇区数 63

1FE :引导扇区结束标志 55AA

MBR DBR 保留扇区 FAT1 FDT=32 DATA 剩余扇区FAT2

FAT16 文件系统逻辑驱动器

FAT32 文件系统 BPB 参数

B :每扇区字节数 512D :每簇扇区数 32E :保留扇区 3210 : FAT 数 211 :引导记录 0 未使用16 :每个 FAT 扇区数 0 , FAT32 不用24 :每个 FAT 扇区数 9542

2c : 引导目录第一簇 2 。是根目录在 DATA 区的起始扇区52 :文件系统 FAT321FE :引导扇区结束标志 55AA

保留扇区 =32 FAT1 DATA 剩余扇区FAT2

FAT32 文件系统

FDT

第九章 计算机软件的安全性在磁盘上的分布情况: ( FAT16 )

主引导 扇区次引导 扇区FAT表 FAT表 1 2

文件目 录表数据 。。。。

保留扇区 (内容应当为全 0 ) 。。。。。

0面 0道 1扇区

1面 0道 1扇区

共有 62 个扇区保留

第九章 计算机软件的安全性 3 。数据与文件的路由 注意: 尽可能不在软件程序中采用路由来访问文件和数据。这样,由于物理盘体的安装替换,磁盘的逻辑盘号将会发生改变,从而改变软件的运行配置环境,造成错误。 如果必须要设置数据路由,必须根据磁盘配置情况予以自动修改并连接。

IDE

EIDE

SCSI

DAC

7/15 个盘

仅支持 2 个盘可支持 4 个盘 可支持多个盘可支持多分组多个磁盘

1 )、硬盘接口 第九章 计算机软件的安全性

2 )、硬盘盘号原有硬盘盘号排序 逻辑盘号重新排序C: D:E:F:

C: D:E:

盘 1

盘 2

光盘活动盘

C: E:F:G:

盘 1

D: H:I:盘

2

光盘活动盘

K:J:

第九章 计算机软件的安全性

单硬盘安装 硬盘在出厂时,一般都将其默认设置为主盘,跳线连接在“ Master”的位置,如果你的计算机上已经有了一个作为主盘的硬盘,现在要连接一个作为从盘。那么,就需要将跳线连接到“ Slave”的位置。

多硬盘的安装与设置 主板上一个 IDE 接口可以接两块硬盘(即主从盘),而主板有两个 IDE口即 IDE1和 IDE2,所以理论上,一台个人电脑可以连接四块硬盘

主从设置。主从设置虽然很简单,但可以说是双硬盘安装中最关键的。一般来说,性能好的硬盘优先选择作为主盘,而将性能较差的硬盘挂作从盘。

第一、最好将两块硬盘分别接在主板上的两个 IDE 口上,而不要同时串在一个 IDE 口上,此时就不需要进行主从盘设置,不过会出现一个问题,即双硬盘盘符交错问题.

第二、如果用户还有如光驱、刻录机等设备,那最好连将两块硬盘连接在同一根硬盘线上,这样的做法是不让光驱的慢速影响到快速的硬盘。

光驱和硬盘到底应当怎样连接 对于标准的 IDE 接口光驱,可以将光驱与硬盘连接在一条数据线上,但必须使用主板上的 Primary IDE(或 IDE1)接口,硬盘跳线应该设为主盘( Master ),光驱应设置为从盘( slave)模式;

也可以让硬盘和光盘使用两条数据线,硬盘使用主板的 Primary IDE(或 IDE1)接口,光驱使用主板的Secondary IDE( IDE2)接口,硬盘和光驱此时都要把跳线设为主盘( Master )。

光驱和硬盘到底应当怎样连接

第九章 计算机软件的安全性 四、软件运行安全 1)软件运行正确性 计算机系统的安全也取决于在其上运行的软件。软件既要确保能够正常运行,还应具有非常高的运行正确性,在执行时其功能不应出现差错,一旦出现差错,则要有出错处理能力和容错能力。要求软件在运行过程中,不能破坏别的运行软件,也不允许别的软件来破坏自己。。

第九章 计算机软件的安全性 2)运行日期和时间 日期和时间是计算机内常用的定时基础,即时钟。 三种时钟概念: ①系统时钟 (system clock) 控制中央处理器和其他逻辑器件和部件工作的时钟。 ②实时时钟 (realtime clock) 根据实时事件和定时方式完成各种控制操作的定时。 ③日历时钟 (canlender clock) 与日历日期和时钟同步的工作时钟。日历时钟记录了计算机工作的日期和时间,记录下了文件和数据存取、注册登录操作、传输接收的日期和时间,某些软件(如金融、银行、统计、交易、气象、商务、军事等)对日期和时间非常敏感,对日期和时间具有很大的依赖性。

第九章 计算机软件的安全性 3 ) Y2K问题 Y2K 问题即“ 2000 ” “ ”年问题 、 千年虫 问题。 问题的起因早至 60年代。当初计算机程序设计人员为节省存储空间,将日期的年份设定仅仅采用了两位字符,默认年份的开头两个数字总是 19,即 1998年被简记为 98。而在读出年份时,又自动地在其前面加上数字 19。目前的几乎所有计算机系统沿袭了这种简化日期记录、表达和计算方式。而2000年在现有系统中只能输入和记录为 00,读出和计算时自动加上 19会成为 1900,使 2000年和 1900年没有区别。这种错误表达,尤其是在计算中将会影起严重的后果,它可能引发金融混乱、统计错误、交易失效,甚至整个计算机系统和信息系统崩溃。

第九章 计算机软件的安全性 4) 9999问题 旧计算机系统软件设计中的一个隐患。 早期计算机程序设计员通常将 1999年 9月 9日定为软件的运行时限,当这些软件到达终止日期时,计算机中的日期和时间 99/9/9会改变成 10/10/10或者 00/00/00,从而将软“ ”件 锁 死,出现死机,导致大量数据丢失和系统崩溃。 在系统软件中防止这样一种隐患也是势在必行的。

第九章 计算机软件的安全性 5)软件补丁 (paste) 一种软件错误补偿方法。 用于正规软件已经发布,在实际运行中发现了原来测试之前未发现的问题。但是版本已无法修改,只能采取用另一种外部程序的方式来弥补这种不足或改正这种错误,使软件能够正常运行。 很多大型软件、包括微软的操作系统,如Windows, Win9x, WinNT, IE, Office等几乎都具有补丁程序。 因为一个大型软件,尤其是具有并发、并行机制的大型系统软件,不可能百分之百严密和正确,只能证明其可用、可信。 补丁程序可从各软件厂商的站点下载。

第九章 计算机软件的安全性 第二节 软件安全保护机制 软件保护有多种软件保护技术和机制,保持软件完整性及黑盒功能,防止软件的非法移植、盗用、运行、复制,防止对系统安全有关的软件的功能的破解。 软件保护致力于软件加密,和解密技术,密文技术,软件的压缩与还原技术,固化与存取技术,运行安

全技术 (含硬件运行控制机制 ),软件的反跟踪与反破析技术,软件自身保护技术和软件访问控制技术。 任何一个软件保护系统都并非是不可攻破的,但是,一个好的软件保护系统会使攻击者付出很大的代价,直至放弃对软件的非法获取。 软件保护主要要解决四个问题,即软件的防复制、防执行、防篡改、防暴露,各种安全技术和机制在实施中贯穿于始终。

第九章 计算机软件的安全性 一、软件防复制(存储访问技术) 软件极易被复制,软件存储在存储设备和载体中,保护和阻止存储载体的操作是防止复制复制的简单方法。 数据的存储介质是各种物理的可存储和记录的设备与器件,它们既是信息的载体,也是信息传递的媒介。存储设备上的信息是由程序、文件和数据构成的,而这些程序、文件和数据是有价的、有特殊用途的,有的是专用的、未经受权不能公开和使用的。由于存储介质的可复制性和可交换性,这些程序、文件和数据就可能被复制、盗窃、出卖,甚至滥用。

第九章 计算机软件的安全性 1.磁盘加密 磁盘 (含其他存储介质 ) 的加解密技术是防复制的关键技术之一,由于磁盘的可加密性和可破解性,使得磁盘的复制和反复制成为可能。 问题解决: 1 )标记与标记识别 研究磁盘 (含其他存储介质 )的结构和特殊性。 磁盘本身无特殊性,而由人们在盘体上作出了物理

“ ” 的或者逻辑的标记,作为磁盘的 指纹 ,使得磁盘本身可以被识别,成为复制和反复制的标记,而通过专门的识别程序来分辨和识别是原盘还是复制盘。 标记识别型磁盘防复制技术的关键在于 "标记 " 的不可复制性,否则,防复制是没有意义的。

第九章 计算机软件的安全性 2)磁盘加密方式 技术包括 : 盘区部分加密、相关磁道加密、磁盘关闭和锁定、扇区锁定、专门复制程序、软件复制标记和复制权限等。可以采用激光加密、指纹加密、非正常磁道加密、磁隙加密等。 优缺点:这些方法简单易行、价格低廉,但使用不便,因为系统必须识别是正常读写、复制还是非法读写、复制,甚至合法用户也不能作备份,存储设备由于频繁读写容易损坏。 加密盘采用专门软件读写,若获得这种专用软件仍然可以复制这种特殊的磁盘。

第九章 计算机软件的安全性 磁盘加密的应用技术(以主流微机为例) 1.额外磁道加密 2.磁道扇区乱序 3.CRC校验加密 4.物理标记加密 磁盘穿孔、激光、电磁、掩膜 5.磁道接缝与扇区间隙加密

例如,软盘额外磁道加密软磁盘标准规格: 标准软盘( 1.44MB )的磁道数: 0-79一共 80 ( 50Hex )道。但实际可以到 0-84道,用于专用数据和特殊数据存储,必须以特殊方式访问。 在额外磁道中可以存储口令、小程序、密码,甚至病毒。

第九章 计算机软件的安全性

访问额外磁道: mov ax,0201 ;读出一个扇区 mov bx,1000 ;读到缓冲区 mov cx,0050 ;读出第 80道 mov dx,0000 ;读 A 盘 int 13 ;实施读操作 int 3 ;暂停

第九章 计算机软件的安全性

AL= 扇区数 ; CH+CL= 磁道号 + 扇区号 ;DH+DL= 磁头号 + 磁盘机号ES:BX= 缓冲区指针 .

软盘的其他应用: 1 )临时存储 2 )作钥匙盘或启动盘: 3 )作加密盘 4 )作口令清洗盘 5 )作系统诊断恢复盘

第九章 计算机软件的安全性

软盘的系统切换: 通过在系统 BIOS 中设置 floppy swap项完成软盘 A 和 B之间的自动切换。以便在应用中由于 A 盘盘符被占用(如从可启动光盘启动时),系统可以转储到 B 盘驱动器。

第九章 计算机软件的安全性

第九章 计算机软件的安全性 2.不完整软件技术 在应用中也称为程序分块技术。 覆盖与交换:程序运行时不全部调入内存,而采用运行一部分,再调入一部分的办法。防止窃取者利用内存映象对程序进行窃取。同时,也缩小了可执行程序段,而以覆盖或压缩文件方式保存另外的可执行段。 转储:在内存不同的空间内存放程序,然后再映射到可执行区。 替换:采用程序逐段替换技术。

第九章 计算机软件的安全性 3.软件安装机制 安装次数 :限定软件使用,规定软件版本安装,限 制软件复制和备份次数。 安装时间 :限定软件使用时效,便于软件更新,防 止软件复制和无限制使用运行。 安装标记 :每安装一次系统,进行一次记录,设定 值超过规定值,拒绝安装。 用户登记 : 软件采用用户登记制,只有用户 ID才能 安装或者运行系统。 软件序列号:采用软件序列号安装软件,系统更新 和升级也同样需要序列号。 口令:利用口令机制限制软件的安装和使用。

第九章 计算机软件的安全性 单一软件防复制技术具有一定的局限性,在实际应用中,多采用综合防复制技术。综合性软件防复制技术将磁盘 (含其他存储介质 )防复制技术与软件单一防复制技术结合,形成带有智能型的防复制技术,使软件的复制和盗窃难以进行。这些技术结合了软件和数据的密文技术、反跟踪技术和自毁技术。 硬盘复制:随着软件功能的增强,软件规模和尺寸增大,程序和数据在存储设备中占据很大的存储空间,商品软件和备份软件逐渐采用光盘方式提供。大型程序利用一般软盘是无法复制的,于是有了硬盘偷窃。 软盘复制: 软盘复制,尤其是钥匙盘的复制,是防护的重点。

第九章 计算机软件的安全性 二、软件防执行(运行控制技术) 软件保护的另一方法是使非法使用者不能正常使用软件,当非法复制的软件开始执行时,采用各种方式阻止程序运行,这就是软件运行控制技术。 程序的执行依赖于系统硬件部件,只有相应的硬件存在,软件的正常功能才能正常地执行。阻止执行的优点在于软件加密可靠,合法备份不受限制,而非法用户即使能够得到复制软件,也不能使用软件。用于阻止软件执行的硬件

“ ”控制机制有 软件狗 、运行加密卡等。

第九章 计算机软件的安全性 1.软件狗 安装在计算机并行口上的一个硬件部件,作为一

“ ”种硬件 钥匙 ,被保护的软件中设置了许多判定和计算“机制,称为 软件锁”,当钥匙与锁相配合时,软件才能

正常运行。软件狗占用并行口,与并行打印机同口,但不影响打印机工作,即软件狗对打印机是透明的。 1)软件狗的保护机制 利用软件锁和硬件钥匙相配合完成 软件程序 硬件部件 ①读写 →→→ 数据 存储区 ↓ ③ ←←←判定数据 ②获得数据 →→是:正常运行 →→否:出错处理

第九章 计算机软件的安全性 硬件部件内部存储的数据和对数据进行判定的机制是保护软件运行的关键。 软件锁组成:发送数据、接受数据和判断决策。 数据:软件狗中的数据可以由用户程序任意写入, 存储器可以多次写入并长期保存。 读写:利用程序构建软件锁。 存储:一个存储区域,用户程序可以访问,掉电后可以保持存储数据,该区域也可作为程序相互调用时的参数传递区域,一种可以卸载和保护的参数传递区。 标志:软件狗中的某个单元作为软件运行次数、软件版本标志和运行时间记录,保证软件运行版本的期限和软件升级标志。

第九章 计算机软件的安全性 接口: Centronics标准并行端口。 功能:控制运行。 不同的软件狗之间可以级联使用。(狗咬狗) 相同的软件狗之间不能级联。 安全:软件狗本身的安全,最容易受到攻击的是软件中的软件锁。软件锁的数量和复杂性直接影响着攻击难度。软件狗的保护程度和复杂性可以视用户的需要而定,增加软件锁虽然可以提高软件的保护强度,但要增大软件尺寸、增加存储量和执行效率,因此要认真选择软件狗的设置。增加软件锁和多次访问软件狗是一种保护策略,将锁和访问分散到软件的各个部分,既提高了保护程度,也增加了被攻击和破解的难度。

第九章 计算机软件的安全性 并行口的工作原理: 由 Intel 8255芯片控制对并行口进行编程。一个并行口有三个端口:

1)数据口,地址: 3BCH,可读写,各位表示如下:

7 6 5 4 3 2 1 0

数据输出

第九章 计算机软件的安全性 并行口的工作原理:2)状态口,地址: 3BDH,可读写,各位表示如下: 7 6 5 4 3 2 1 0

数据输入0 保留 1 保留2 IRQ 有请求 3 出错4 选中状态 5 缺纸( paper out )6 应答( ACK ) 7 系统忙( busy )

第九章 计算机软件的安全性 并行口的工作原理:3)控制口,地址: 3BEH,可读写,各位表示如下: 7 6 5 4 3 2 1 0

0 选择 1 自动回车 2 初始化( init ) 3 选择 4 IRQ 有效 5 未用 6 未用 7 未用 这些端口可以随意使用,为了不影响打印机,一般采用数据口作输出,状态口作输入。

第九章 计算机软件的安全性VCC

IN OUT

GND

一个“非”门

数据口第 0 位, 3BCH/0=1, 作 VCC

数据口第 1 位,3BCH/1=1, 作输入数据

状态口第 4 位,3BDH/4 作输出

公共地

软件狗简单机理

第九章 计算机软件的安全性一个简单软件锁实例如下: MOV AL,1 MOV DX,3BCH 从 3BC地址 /0 “位输出 1”, OUT DX,AL 接上模拟电源, Vcc“ ”非 门上电 MOV AL,3 从 3BC地址 /1位, OUT DX,AL “ ” “对 非 门输入 1”高电平 INC DX 从 3BD地址 /4位, IN AL,DX “ ” “取出 非 门输出,应当为 0” DEC DX 退回 3BC地址, TEST AL,10H 测试寄存器第 4 “位是否为 0” JNZ ERROR “不为 0”测试失败,转错误处理 注意: LPT1并行口的负载能力有限,要防止烧毁,因此可以不用 TTL而改用 E2PROM 。

第九章 计算机软件的安全性 2.运行加密卡 加密卡类似于其他的 I/O扩展卡,是安装在计算机机箱内部扩展槽中的硬件部件,其优点是加密变化多,反跟踪措施多,保护机制较完备,但安装不方便。 原理:软件锁配卡上硬件钥匙 3.软件固化技术 程序存储在非易失性器件和芯片中。 解决对这些固化程序或数据的存取技术和方式。 研究软件固化、软件运行控制机制。 利用硬件或软硬结合实现加解密技术,提高加解密速度、节省时间、减少存储空间和运行空间、防止跟踪破析。

第九章 计算机软件的安全性 三、软件防暴露(加密解密技术) 防暴露 (防泄漏 ) 是信息安全性的必要保证,也是信息可用性的必要因素。其目的是保护软件、防止非法查阅、修改、复制、分析、盗用、移植。软件防暴露技术包括了软件加密、软件压缩等。配合其他机制达到防泄露的目的。 1.软件加解密技术 软件的隐藏技术、加解密技术。, 密文技术是加解密的关键,现代密码技术都可用于软件加解密。密码技术的使用和加解密技术的实施,不应影响软件性能和功能,尤其是对时间、空间、速度等敏感的软件和程序,实时软件以及某些多媒体软件要进行专门的加解密研究,取得应有的加密功效和实用功效。

第九章 计算机软件的安全性 2.软件压缩还原技术 另一种软件防暴露技术,既可以反查阅、反分析、反跟踪,也可以节省存储空间。 实现包括: 程序自身压缩解压。 专用压缩解压程序: ZIP, ARJ 、 RAR 等。 压缩技术和还原技术是研究的重点。 压缩技术 不能影响软件本身功效与效能。

第九章 计算机软件的安全性 3.软件反跟踪技术 反跟踪技术防止软件被非法地剖析、分析、盗用、移植,以及对专用软件,如 : 军用软件、金融软件等的逆向工程的研究。 反跟踪技术采用破坏跟踪、反穷举法达到软件保护目的,使入侵者不能跟踪或者跟踪困难。研究针对相应系统平台的破坏跟踪方式,如 : 检测跟踪法、键盘锁定法、干扰视频法、循环启动和系统死锁法等,也可以采用迷宫程序法、隐蔽程序流、废指令与逆指令流、反反汇编法等。与软件加密和硬件加密相结合的反跟踪技术的研究则是新颖的和效率高的。 1. 屏蔽中断法 2.定时时序法 3. 调试程序抑制技术 4.功能封锁 5.程序设计技巧

反跟踪举例( 1) .数据交换随机噪声技术:有效地对抗逻辑分析仪分析及各种调试工具的攻击。( 2) .迷宫技术:在程序入口和出口之间包含大量判断跳转干扰,动态改变执行次序,提升狗的抗跟踪能力。( 3) .可由软件开发商设置 32位口令,口令错误将不能对存储区进行读写。 ( 4) . 时间闸 : 某些狗内部设有时间闸,各种操作必须在规定的时间内完成。狗正常操作用时很短,但跟踪时用时较长,超过规定时间狗将返回错误结果。( 5) . 单片机 : 硬件内置单片机,固化的单片机软件保证外部不可读,从而保证狗不可仿制。

( 6) .抑制跟踪中断 DEBUG的 T和 G命令分别要运行系统的单步中断和断点中断服务程序 ,在系统向量表中这两个中断的中断向量分别为 1和 3 ,中断服务程序的入口地址分别存放在 0000:0004和 0000:000C 起始的 4个字节中 。因此 , 当这些单元中的内容被修改后 ,T和 G命令将无法正常执行 , 具体实现方法 :(1) 将这些单元作为堆栈使用 ;(2) 在这些单元中送入软件运行的必要数据 ;(3) 将软件中某个子程序的地址存放在这些单元中 , 当需要调用时使用 INT 1和 INT 3指令来代替 CALL指令 ;(4) 放入惩罚性程序的入口地址 。

( 7) .封锁键盘输入各种跟踪调试软件在工作时 ,都要从键盘上接收操作者发出的命令 ,而且还要从屏幕上显示出调试跟踪的 结果 ,这也是各种跟踪调试软件对运行环境的最低要 求。因此反跟踪技术针对跟踪调试软件的这种“弱点 ” ,在加密系统无须从键盘或屏幕输入、输出信息时 ,关闭了这些外围设备 ,以破坏跟踪调试软件的运行环 境 。键盘信息的输入采用的硬件中断方式 ,由 BIOS中的键盘中断服务程序接收、识别和转换 ,最后送入可存放 16个字符的键盘缓冲区 。例:改变键盘中断服务程序 9 、 BIOS的键盘 I/O 16H中断服务程序的入口地址。

例:禁止键盘中断 : 键盘中断是一个可屏蔽中断 ,可通过向 8259中断控制器送屏蔽控制字来屏蔽键盘中断控制键盘的是中断屏蔽寄存器的第 1 位 ,只要将该位置 1,即可关闭键盘的中断。   IN AL,21H   OR AL,02H   OUT 21H,AL   需要开放键盘中断时 ,也要用三条指令 :   IN AL,21H   AND AL,FDH   OUT 21H,AL

( 8) .对程序分块加密执行 为了防止加密程序被反汇编 ,加密程序最好以分块的密文形式装入内存 ,在执行时由上一块加密程序对其进行译码 ,而且在 某一块执行结束后必须立即对它进行清除 ,这样在任何时刻内不可能从内存中得到完整的解密程序代码 。这种方法除了能防止反汇编外还可以使解密者无法设置断点 ,从而从一个侧面来防止动态跟踪 。

( 9) .迷 惑 、 拖 垮 解 密 者 设置大循环 :程序越简单 ,就越易读 ,跟踪也就越方便 ,便于这个原因 ,在加密系统中设置大循环 ,可以在精力上消耗解密者 ,延长跟踪破译加密系统的时间。这种反跟踪技术已经被广泛应用 ,而且取得了较好的效果。它的具体实现方法是 :在加密程序中设置多重循环 , 并使上一层循环启动下一层循环 , 下一层循环启动下下一层循环 ,如此循环 ,而且还可以频繁地调用子程序 , 要保证不能有一层循环被遗漏不执行。

( 10) .逆指令流法指令代码在内存中是从低地址向高地址存放的 ,CPU执行指令的顺序也是如此 ,这个过程是 由硬件来实现的 ,而且这个规则已经被人和跟 踪调试软件牢牢接收。针对这个方面逆指令流 法特意改变顺序执行指令的方式 ,使 CPU按逆 向的方式执行指令 ,这样就使得解密者根本无 法阅读已经逆向排列的指令代码 ,从而阻止解 密者对程序的跟踪 。因为顺序执行指令是由 硬件决定的 , 所以如果用软件的方式设计 CPU按 逆向执行指令 ,就显出相当困难和繁琐了 ,不过 逆指令流法是一个非常有吸引 力和使用前景的反跟踪技术 ,如果能把这种技术成功地 运用在磁盘加密技术中 ,势必会给解密者造成巨大的 压力和威慑 。

( 11) .混合编程法 :破译加密系统的首要工作是读取程序和弄清程序 思路 , 并针对其中的弱点下手。为了阻挠解密 者对加密程序的分析 ,可以尽量将程序设计得 紊乱些 ,以降低程序的可读性。这种方法具体 在反跟踪技术中使用的就是混合编程法等 ,因 为高级编译语言的程序可读性本身就较差 ,如果再将几种高级语言联合起来编写使用 ,一定会极大 的降低程序的可读性 。

4 、软件分析技术 ( 1 )从软件使用说明和操作中分析软件 欲破解一软件,首先应该先用用这软件,了解一下功能是否有限制,最好阅读一下软件的说明或手册 , 特别是自己所关心的关键部分的使用说明,这样也许能够找点线索。

( 2 )静态反汇编 所谓静态分析即从反汇编出来的程序清单上分析。从提示信息入手进行分析在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解。 crack时常用的静态分析工具是 W32DASM和 HIEW等。

( 3 )动态跟踪分析 虽然从静态上可以了解程序的思路,但是并不可能真正了解地了解软件的细节,如静态分析找不出线索,就要动态分析程序,另外,碰到压缩程序,静态分析就无能为力了,只能动态分析了。所谓动态分析是利用 SOFTICE 或 TRW2000 一步一步地单步执行软件。

①、对软件进行粗跟踪所谓粗跟踪,即在跟踪时要大块大块地跟踪,也就是说每次遇到调用 CALL指令、重复操作指令 REP.循环操作 LOOP指令以及中断调用 INT指令等,一般不要跟踪进去,而是根据执行结果分析该段程序的功能。

②、对关键部分进行细跟踪 对软件进行了一定程度的粗跟踪之后,便可以获取软件中我们所关心的模块或程序段,这样就可以针对性地对该模块进行具体而详细地跟踪分析。 一般情况下,对关键代码的跟踪可能要反复进行若干次才能读懂该程序,每次要把比较关键的中间结果或指令地址记录下来,这样会对下一次分析有很大的帮助。

第九章 计算机软件的安全性四、软件防篡改(完整可用技术) 软件防篡改是信息完整性的必要条件,是信息可用性的基础。计算机犯罪活动,通常是由篡改计算机应用程序入手,通过改变程序中的某些代码,删除和改动某些文件数据,替换某些文件来进行。恶意程序的进入和传播,也常常通过感染程序、附着在程序或数据之中,进行潜伏和再传播,这些被非法修改的程序还通过携带、交换和通过网络传播到远方,它们是信息系统不安全的重要因素。 软件防篡改研究的目标与内容涉及面很广,包括

软件自身完整性的理论与机制研究、软件自保护技术(含自诊断、自检测技术、自毁技术 ) 研究,软件防病毒技术研究,磁盘 (含其他存储介质 ) 的防篡改、防破坏技术。

第九章 计算机软件的安全性 1.软件自保护技术 防篡改首先要求软件能够自保护。 自诊断、自检测技术、防病毒技术、自毁技术 软件本身是否已受到攻击、受到改动? 通过诊断、比较、分析得以确认,这个工作可以由系统和其他专用软件程序承担,也可以由软件自己完成。 1)自诊断 程序校验和保护 程序自生成技术 2)自检测技术 校验和(整体校验、分区校验)

第九章 计算机软件的安全性程序自诊断、自保护技术实例: 校验和 校验和是一种常用的代码完整性保护措施,可用于各种代码存储、传输和运行过程。 在程序体中嵌入一小段计算程序代码值的“逻辑和”,运行时如果“逻辑和”不正常,该程序代码被改动过。这个“逻辑和”被称为“校验和”,导致正确校验和的互补值被称为“校验和值”。

第九章 计算机软件的安全性程序自诊断、自保护技术实例:设置校验和操作过程: 在程序中设置一个校验和位,其初始代码值为 00,确定一个代码计算起始位置和终止位置,从该位置开始对所有后继字符代码值进行“逻辑加”(二进制加法,进位丢掉),一直进行到终止位置为止。此时得到一个代码值,取其补数作为校验和值,填入校验和位。例如: 用作减法求补: 100 逻辑加结果: - 5A 得到互补数: A6 --------- 校验和值

第九章 计算机软件的安全性程序自诊断、自保护技术实例:验证校验和操作过程: 在程序中用一个小程序,从预先确定的代码计算起始位置开始对所有后继字符(含校验和位)的代码值进行“逻辑加”(二进制加法,进位丢掉),一直进行到终止位置为止。此时如果结果为 00 ,表示校验正常,否则,代码有可能被改动,例如: 代码逻辑加结果: 5A 互补的校验和值: + A6 校验和结果: 100 丢掉

第九章 计算机软件的安全性程序自诊断、自保护技术实例: 功能增强与改动:1)校验和值可以由用户自行设置。2)校验和位可以设一个,也可以设置多个。 有的的固定的,有的是经计算后产生的。3)校验和位在程序中的位置可以是任意的, 但它(它们)必须包含在计算过程中。4)校验和计算的范围可以预先设定。5)如果程序运行中具有动态参数和指令改动, 不适合采用校验和保护方式。6)对已有的可执行程序,可以采用外加法增加 校验和保护方式。

五、缓冲区溢出与病毒攻击 缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。

溢出根源在于编程 缓冲区溢出是由编程错误引起的。如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。

第一个程序#include <stdio.h>#include <string.h>

void SayHello(char* name){ char tmpName[80];

strcpy(tmpName, name);

/* Do some checks for tmpName. */

printf("Hello %s\n", tmpName);} hello.c

第一个程序int main(int argc, char** argv){ SayHello(argv[1]); return 0; }

hello.c

运行情况C:\hello computer↙Hello computer似乎一切正常,不会有什么问题 。。。。再试一下。。。 或:C : \hello aaaa……………………………………………….aHello aaaa……………………………………………….a 接下来是………………

hello.c

这个程序的函数含有一个典型的内存缓冲区编码错误 . 该函数没有进行边界检查就复制提供的字符串 , 错误地使用了 strcpy()而没有使用 strncpy(). 如果你运行这个程序就会产生段错误 . 原因是在命令行输入的数据“ aaaa…a” 长度超过了在 SayHello函数中的局部变量长度 , 于是覆盖了在堆栈上方的返回地址,在 print之后就崩溃了

发生了什么事发生了什么事??

产生溢出的理论基础: 1. 平面内存结构: 4GB 或更大逻辑地址空间,程序运行时可以被装载到相对固定的地址空间,使得确定攻击代码地址更为方便 2. 数据与代码同处于一个地址空间:堆栈可执行代码数据共同存储这一现代计算机模型使得溢出攻击真正可行,攻击者可以精心编制输入数据,得到运行权 3. CPU call调用利用栈保存返回地址: Call调用使用堆栈保存返回地址,使得更改程序返回地址成为可能 4. C函数在栈中保存局部变量

进程内存布局代码区数据区堆

栈段

字符串向下生长栈段向上生

0x00000000

0xFFFFFFFF

栈从下往上生长C语言不进行边界检查

一个溢出攻击的实例分析   int i;    void function(void)    {char buffer[240]; //create a buffer     for (i=0; <512; i++)//iterate 512 times     buffer[i]='A'; //copy the letter A return }   接下来是当这个函数被执行时的后果。

1)函数使用长度为 240个字节的缓冲区,该缓冲区恰好位于内存地址是 00000077   缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)    空白   旧基址指针( 8 字节)      12345678   返回的指令指针( 8 字节)    00401000   

一个溢出攻击的实例分析(续1)

2)程序被执行时,函数开始将 A填写到缓冲区中   缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)  AAAAAAAAA......   旧基址指针( 8 字节)      12345678   返回的指令指针( 8 字节)    00401000

一个溢出攻击的实例分析(续2)

3 )超过 240 个字节,缓冲区被写满了, 240 个字节以后的内容溢出到下一个内存区域,覆盖旧基址指针和返回指令指针   缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)  AAAAAAAAA......   旧基址指针( 8 字节)      AAAAAAAA   返回的指令指针( 8 字节)   AAAAAAAA 或 0x41414141

一个溢出攻击的实例分析(续3)

hyj
A的ASCLL码是41

4) 现在假设函数没有填写 A ,而是插入了恶意代码   缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)    恶意代码 ......   旧基址指针( 8 字节)      12345678   返回的指令指针( 8 字节)    40100000

一个溢出攻击的实例分析(续4)

5 )缓冲区被填满了恶意代码,旧基址指针也被改写   缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)    恶意代码 ......   旧基址指针( 8 字节)   ××××××××   返回的指令指针( 8 字节)    00401000

一个溢出攻击的实例分析 (续5)

6 )接下来返回的指令指针也被改写,不是随机而是根据现在包含恶意代码的缓冲区本身的地址  缓冲区地址( 8 字节)      00000077   缓冲区内容( 240 字节)    恶意代码 ......   旧基址指针( 8 字节)   ××××××××   返回的指令指针( 8 字节)   00000077 7) 在缓冲区被填满之后,程序定位在指令指针提供的地址处,并且开始执行恶意代码

一个溢出攻击的实例分析(续6)

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。为了达到这个目的,攻击者必须达到如下的两个目标: 1. 在程序的地址空间里安排适当的代码。 2. 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

缓冲区溢出的漏洞和攻击

1 、植入法:   攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。

在程序的地址空间里安排适当的代码的方法

2 、利用已经存在的代码:  有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“ exec (“/bin/sh”)”

在程序的地址空间里安排适当的代码的方法

1 、活动纪录( Activation Records ): 每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击( Stack Smashing Attack ),是目前最常用的缓冲区溢出攻击方式。

控制程序转移到攻击代码的方法

函数指针( Function Pointers ): “void (* foo)()”声明了一个返回值为 void函数指针的变量 foo 。函数指针可以用来定位任何地址空间,所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了!

控制程序转移到攻击代码的方法

长跳转缓冲区( Longjmp buffers ):在 C语言中包含了一个简单的检验 /恢复系统,称为 setjmp/longjmp 。意思是在检验点设 定“ setjmp(buffer)” ,用“ longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“ longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样, longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区

控制程序转移到攻击代码的方法

缓冲区溢出的保护方法 更为小心的程序设计

将安全相关的功能隔离到仔细检查的代码内 让栈不可运行

会导致若干技术难题 基于编译器的方法

在代码内自动增加边界检查( very slow ) 运行过程中进行栈完整性检查 重新排列栈变量( no slowdown )

1  编写正确的代码   编写正确的代码是一件非常有意义但耗时的工作,特别象编写 C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。

缓冲区溢出的保护方法

缓冲区溢出的保护方法 非执行的缓冲区 通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被殖入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。

缓冲区溢出的保护方法 数组边界检查     殖入代码引起缓冲区溢出是一个方面,扰乱程序的执行流程是另一个方面。不象非执行缓冲区保护,数组边界检查完全放置了缓冲区溢出的产生和攻击。这样,只要数组不能被溢出,溢出攻击也就无从谈起。   为了实现数组边界检查,则所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。

问题一 void main() { char buf[1024]; gets(buf); } 是否有缓冲区溢出,如何编程解决?

使用以下代码解决:#define BUFSIZE 1024void main() { char buf[BUFSIZE]; fgets(buf, BUFSIZE, stdin); }

问题二 考虑以下代码:void main(int argc, char **argv) { char usage[1024]; sprintf(usage, "USAGE: %s -f flag [argv1]\n", argv[1]); }

void main(int argc, char **argv) { char usage[1024]; sprintf(usage, “USAGE: %.1000s -f flag [arg1]\n", argv[1]); }

说明 : %.1000s 属于 %m.ns格式,输出共 m列,只取左端 n 位.

使用以下代码解决:

常见缺陷: SQL流量注入攻击法循规蹈矩的用户ID: 1001SELECT HasShippedFROM detail WHERE ID=‘1001'

常见缺陷: SQL流量注入攻击法

不守规矩的用户ID: 1001' or 1=1 --SELECT HasShippedFROM detail WHERE ID=‘1001' or 1=1 -- '

常见缺陷: SQL 流量注入攻击法ASP 程序密码验证漏洞 漏洞描述: 很多网站把密码放到数据库中,在登陆验证中用以下 sql,( 以 asp 为例) sql="select * from user where username='"&username&"'and pass='"& pass &'" 

此时,您只要根据 sql 构造一个特殊的用户名和密码,如: ben‘ or ’1‘=’1  这样 , 程序将会变成这样 :

  sql="select*from username where username="&ben'or'1'=1&"and pass="&pass&" 

另外我们也可以构造以下的用户名: username='aa' or username<>'aa' ond pass='aa' or pass<>'aa' 相应的在浏览器端的用户名框内写入: aa' or username<>'aa 口令框内写入: aa' or pass<>'aa,注意这两个字符串两头是没有 ' 的。 这样就可以成功的骗过系统而进入。

常见缺陷: SQL 流量注入攻击法

行径恶劣的用户ID: 1001’ drop table orders --SELECT HasShipped FROM detailWHERE ID= ‘1001' drop table orders -- '

常见缺陷: SQL 流量注入攻击法

图谋不轨的用户ID: 1001’ exec xp_cmdshell(‘fdisk.exe’) --SELECT HasShipped FROM detailWHERE ID= ‘1001' exec xp_cmdshell(‘fdisk.exe’)--'

top related