缓冲区溢出攻击

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6个段寄存器(ES、CS、SS、DS、FS和GS): 段寄存器是根据内存分段的管理模式而设置的。内 存单元的物理地址由段寄存器的值和一个偏移量组 合而成的,这样可用两个较少位数的值组合成一个 可访问较大物理空间的内存地址。 CPU内部的段寄存器: ECS——代码段寄存器(Code Segment Register), EDS——数据段寄存器(Data Segment Register),
1)攻击者可用任意数据覆盖堆栈中变量的内容; 2)覆盖堆栈中保存的寄存器内容,导致程序崩溃; 3)把堆栈里面的返回地址覆盖,替换成一个自己指定的
地方,而在这个个地方,可以植入一些精心设计了的 代码以达到攻击的目的。
2019/11/29
计算机系统安全原理与技术(第2版)
17
缓冲区溢出程序2
2).覆盖堆栈中变量的内容(7-2pass)
2019/11/29
计算机系统安全原理与技术(第2版)
10
1 缓冲区溢出基础知识-寄存器
1个指令指针寄存器(EIP): 指令指针EIP(Instruction Pointer)是存放下次 将要执行的指令在代码段的偏移量。
2019/11/29
计算机系统安全原理与技术(第2版)
11
1 缓冲区溢出基础知识-常用汇编指令
在格式化控制符中,有一种鲜为人知的控制符 %n。这个控制符用于把当前输出的所有数据 的长度写回一个变量中去
2019/11/29
计算机系统安全原理与技术(第2版)
25
2 格式化字符串漏洞
3.用printf向内存写数据
2019/11/29
计算机系统安全原理与技术(第2版)
26
2 格式化字符串漏洞
3.用printf向内存写数据
2019/11/29
计算机系统安全原理与技术(第2版)
29
3 安全编程
1.C语言的安全编程
(5)C语言没有提供异常处理机制,其异常检测处理 是由程序员预设完成的。
微软的Michael Howard与David LeBlanc所合著的 “Writing Secure Code”(编写安全的代码)一书中集 中讨论了编写安全代码的方方面面,读者可进一步阅 读。
以printf()函数为例:
int printf(const char*format,agr1,agr2,……);
format的内容可能为(%s,%d,%p,%x,%n……), 将数据格式化后输出。这种函数的问题在于函数 printf不能确定数据参数arg1,arg2,……究竟在什么 地方结束,也就是说,它不知道参数的个数。printf 函数只会根据format中的打印格式的数目依次打印堆 栈中参数format后面地址的内容。
2个变址寄存器(ESI和EDI) :
寄存器ESI、EDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内 的偏移量,用它们可实现多种存储器操作数的 寻址方式,为以不同的地址形式访问存储单元 提供方便。
2019/11/29
计算机系统安全原理与技术(第2版)
7
1 缓冲区溢出基础知识-寄存器
2019/11/29
计算机系统安全原理与技术(第2版)
18
缓冲区溢出程序3
3).覆盖堆栈中寄存器的内 容( 7-3字符覆盖溢出)
在栈上声明的各种变量的位 置就紧靠着调用函数的返回 地址。如果用户输入的数据 越过边界就会将调用函数的 返回地址覆盖,造成程序崩 溃。
2019/11/29
计算机系统安全原理与技术(第2版)
应用系统的编程安全
1 缓冲区溢出 2 格式化字符串漏洞 3 安全编程
2019/11/29
计算机系统安全原理与技术(第2版)
1
1 缓冲区溢出
1).什么是缓冲区溢出
简单的说,缓冲区溢出(Buffer Overflow)就 是通过在程序的缓冲区写入超出其长度的内容, 从而破坏程序的堆栈,使程序转而执行其他指 令,以达到攻击的目的。
for(int j=0;j<4;j++)
{
buf[k-j-1]=addr[3-j];
}
}
void main()
{
void test(int i);
test(1);
பைடு நூலகம்20
2 格式化字符串漏洞
格式化字符串的漏洞产生于数据输出函数中对输出格 式解析的缺陷,其根源也是C程序中不对数组边界进 行检查的缓冲区错误。
2个指针寄存器(ESP和EBP) :
它们主要用于访问堆栈内的存储单元,并且规定: EBP为基指针(Base Pointer)寄存器,用它可直接 存取堆栈中的数据; ESP为堆栈指针(Stack Pointer)寄存器,用它只可 访问栈顶。
2019/11/29
计算机系统安全原理与技术(第2版)
8
1 缓冲区溢出基础知识-寄存器
19
缓冲区溢出程序4
void come()
{ printf("Success!");
} void test(int i) {
char buf[12];//用于发生溢出的数组 int addr[4]; int k=(int)&i-(int)buf; int go=(int)&come;
addr[0]=(go<<24)>>24; addr[1]=(go<<16)>>24; addr[2]=(go<<8)>>24; addr[3]=go>>24;
12
1 缓冲区溢出基础知识-常用汇编指令
push:入栈指令 32位平台,push指令将一个32位的操作数压入 堆栈,导致esp减4。因为esp指向栈顶,且堆 栈是向小地址生长的,所以会导致esp减4。 pop:出桟指令 跟push指令对应,在32位平台,pop指令将一 个32的数弹出堆栈,会导致esp加4. pop指令 的参数一般是寄存器,将栈顶的数据弹出到寄 存器。
2019/11/29
计算机系统安全原理与技术(第2版)
4
1 缓冲区溢出基础知识-寄存器
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存 器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器 (EFlags)
2019/11/29
计算机系统安全原理与技术(第2版)
28
3 安全编程
1.C语言的安全编程
(1)对内存访问错误的检测和修改。
(2)对于缓冲区溢出的覆盖错误,可由程序员预设缓 冲区的大小。
(3)指针引用是C中最灵活、最核心、最复杂,也是 最易出错的部分。
(4)出于保密的需要,在程序设计时要涉及到创建密 钥或密码等问题,具体到C程序设计中则是随机数的 选取和使用问题。
2019/11/29
计算机系统安全原理与技术(第2版)
9
1 缓冲区溢出基础知识-寄存器
EES——附加段寄存器(Extra Segment Register), ESS——堆栈段寄存器(Stack Segment Register), EFS——附加段寄存器(Extra Segment Register), EGS——附加段寄存器(Extra Segment Register),
2019/11/29
计算机系统安全原理与技术(第2版)
30
7.4 软件保护
7.4.1 软件技术保护的基本原则 7.4.2 密码保护技术 7.4.3 电子注册保护技术 7.4.4 结合硬件的保护技术 7.4.5 基于数字签名的保护技术 7.4.6 软件水印 7.4.7 软件的反动态跟踪技术
2019/11/29
2019/11/29
计算机系统安全原理与技术(第2版)
21
2 格式化字符串漏洞
1.printf中的缺陷
第一个printf调用是正确的, 第二个调用中则缺少了输出 数据的变量列表。那么第二 个调用将引起编译错误还是 照常输出数据?如果输出数 据又将是什么类型的数据呢?
2019/11/29
计算机系统安全原理与技术(第2版)
2019/11/29
计算机系统安全原理与技术(第2版)
2
1 缓冲区溢出
1).什么是缓冲区溢出
程序是从内存低端向高端按顺序存放的,输入 的形参按照自右至左的顺序入栈,而堆栈的生 长方向与内存的生长方向相反,因此在堆栈中 压入的数据超过预先给堆栈分配的容量时,就 会出现堆栈溢出。
简单地说,缓冲区溢出的原因是由于字符串处 理等函数没有对数组的越界加以监视和限制, 结果覆盖了堆栈数据。缓冲区的溢出有各种不 同的类型。
2019/11/29
计算机系统安全原理与技术(第2版)
3
1 缓冲区溢出
1).什么是缓冲区溢出
一般而言,有以下几种缓冲区溢出攻击的方式:
1)攻击者可用任意数据覆盖堆栈中变量的内容。 2)覆盖堆栈中保存的寄存器内容,导致程序崩溃。 3)把堆栈里面的返回地址覆盖,替换成一个自己 指定的地方,而在那个地方,可以植入一些精心设 计了的代码以达到攻击的目的。
22
2 格式化字符串漏洞
1.printf中的缺陷
2019/11/29
计算机系统安全原理与技术(第2版)
23
2 格式化字符串漏洞
2.用printf读取内存数据 输入“%p,%p,%p……”,实际上可以读出 栈中的数据
2019/11/29
计算机系统安全原理与技术(第2版)
24
2 格式化字符串漏洞
3.用printf向内存写数据
int local; local=m+n; }
void main() {
int t1=0x1111; int t2=0x2222; foo(t1,t2); }
2019/11/29
计算机系统安全原理与技术(第2版)
16
缓冲区溢出方式
缓冲区溢出的原因是由于字符串处理等函数( strcpy 、 strcmp)没有对数组的越界加以监视和限制,结果覆 盖了堆栈数据。有以下几种缓冲区溢出攻击方式:
2019/11/29
计算机系统安全原理与技术(第2版)
5
1 缓冲区溢出基础知识-寄存器
4个数据寄存器(EAX、EBX、ECX和EDX): 数据寄存器主要用来保存操作数和运算结果等 信息,从而节省读取操作数所需占用总线和访 问存储器的时间。
2019/11/29
计算机系统安全原理与技术(第2版)
6
1 缓冲区溢出基础知识-寄存器
2019/11/29
计算机系统安全原理与技术(第2版)
14
栈帧的一般结构
…[local1] [local2] …[localn][EBP][RET地址][参数1] [参数2]…[参数n]
2019/11/29
计算机系统安全原理与技术(第2版)
15
缓冲区溢出程序1(test)
关注函数调用时堆栈变化
void foo(int m,int n) {
这是因为程序中将变量num的地址
压入堆栈,作为printf()的第二个参
数,“%n”会将打印总长度保存到
对应参数的地址中去。打印结果见
图7-25,0x616161的十进制值为
1633771873,按照DWORD类型,
20其1值9/长11度/2为9 20。
计算机系统安全原理与技术(第2版)
27
3 安全编程
sub:减法指令 第一个参数是被减数所在的寄存器,第二个参数是减 数。 add:加法指令 第一个参数是被加数所在的寄存器,第二个参数是加 数。 注:sub和add指令常被用来操作堆栈,例如,如果要 在堆栈中分配四个四字节长整型数的空间,就没有必 要调用四次push指令,简单调用sub esp,16 (16=4*4)就可以了,当然也可以调用add指令恢复 堆栈。
计算机系统安全原理与技术(第2版)
31
7.4.1 安全编程
程序的正确性是由程序的编写者来保证的。为了避免 出现缓冲区溢出的漏洞,在编写程序的一开始就必须 将安全因素考虑在内。
忽略了编码的安全性大致来说有两种。
第一种是直接进行设计、编写、测试,然后发布,忘 记了程序的安全性。或者设计者自认为已经考虑到了, 而做出了错误的设计。
第二种错误是在程序完成以后才考虑添加安全因素, 在已经完成了的功能外包裹上安全功能。这样做不仅 要付出非常昂贵的代价,更重要的是添加的安全功能 有可能会影响已经实现的功能,甚至会造成某些功能 的不可实现。
13
1 缓冲区溢出基础知识-常用汇编指令
call:调用函数
call指令和jmp指令不同,call指令会先把下一 条要执行的指令入栈,然后跳到被调用的函数 的地方。所以,call指令相当于push+jmp。
ret:从函数返回
ret指令和jmp指令不同,ret指令会先把函数的 返回地址出桟,再跳到返回的地址。所以,ret 指令相当于pop+jmp。
相关文档
最新文档