缓冲区溢出

Shellcode的原理及编写

大兔子大兔子 提交于 2020-03-02 09:18:20
1.shellcode原理 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。 如下链接是shellcode编写的基础,仅供参考 http://blog.chinaunix.net/uid-24917554-id-3506660.html 缓冲区溢出的shellcode很多了,这里重现下缓冲区溢出。 [cpp] view plain copy <EMBED id=ZeroClipboardMovie_1 height=18 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src

缓存溢出

江枫思渺然 提交于 2020-02-23 04:47:10
缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。 1. 缓存溢出攻击方式 1.1 破坏活动记录 函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指针、变量缓存区等值,它们在栈中的存放顺序如图所示。 由它们在栈中的存放顺序可知,返回地址、栈指针与变量缓存区紧邻,且返回地址指向函数结束后要执行的下一条指令。栈指针指向上一个函数的活动记录,这样攻击者可以利用变量缓存区溢出来修改返回地址值和栈指针,从而改变程序的执行流。 1.2 破坏堆数据 程序运行时,用户用C、C++内存操作库函数如malloc、free等在堆内存空间分配存储和释放删除用户数据,对内存的使用情况如内存块的大小、它前后指向的内存块用一个链接类的数据结构予以记录管理,管理数据同样存放于堆中,且管理数据与用户数据是相邻的。这样,攻击者可以像破坏活动记录一样来溢出堆内存中分配的用户数据空间,从而破坏管理数据。因为堆内存数据中没有指针信息,所以即使破坏了管理数据也不会改变程序的执行流,但它还是会使正常的堆操作出错,导致不可预知的结果。 1.3 更改函数指针 指针在C、C+

内存越界引用与缓冲区的溢出攻击

旧街凉风 提交于 2020-02-11 04:47:55
转载自:https://wdxtub.com/2016/04/16/thin-csapp-2/ 缓冲区溢出 这一节是机器代码的最后一部分,主要说说由缓冲区溢出引起的攻防大战。我们先来看看程序在内存中是如何组织的(x86-64 Linux): 最上面是运行时栈,有 8MB 的大小限制,一般用来保存局部变量。然后是堆,动态的内存分配会在这里处理,例如 malloc() , calloc() , new() 等。 然后是数据,指的是静态分配的数据, 比如说全局变量,静态变量,常量字符串。最后是共享库等可执行的机器指令,这一部分是只读的。 可以见到,栈在最上面,也就是说,栈再往上就是另一个程序的内存范围了,这种时候我们就可以通过这种方式修改内存的其他部分了。 举个例子: typedef struct { int a[2]; double d; } struct_t; double fun(int i) { volatile struct_t s; s.d = 3.14; s.a[i] = 1073741824; // 可能会越界 return s.d; } 不同的 i 可能的执行结果是: fun(0) -> 3.14 fun(1) -> 3.14 fun(2) -> 3.1399998664856 fun(3) -> 2.00000061035156 fun(4) -> 3.14 fun

SEED缓冲区溢出实验笔记

陌路散爱 提交于 2020-02-10 20:17:27
缓冲区溢出实验(Linux 32位) 参考教程与材料: http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本文记录了做SEED缓冲区溢出实验的体会与问题,侧重实践,而不是讲解缓冲区溢出原理的详细教程) 1. 准备工作 使用SEED ubuntu虚拟机进行缓冲区溢出实验,首先要关闭一些针对此攻击的防御机制来简化实验。 (1)内存地址随机化(Address Space Randomization):基于Linux的操作系统一般使堆和栈的开始地址随机化,使得攻击者猜测确切的地址变得困难。使用如下指令关闭该功能。 $ su root Password: (enter root password) #sysctl -w kernel.randomize_va_space=0 (2)The StackGuard Protection Scheme:GCC编译器实现了一个被称为“Stack Guard”的安全机制来防御缓冲区溢出攻击。所以在编译漏洞程序时加上-fno-stack-protector参数来关闭该机制。 (3)Non-Executable Stack:Ubuntu曾经允许栈执行,但是现在程序必须声明栈是否允许执行。内核和链接器检查程序头的标志来判断是否允许栈被执行

20169217 2016-2017-2 《网络攻防实践》第十周学习总结

大兔子大兔子 提交于 2020-02-08 04:34:15
实践报告 和结对同学一起完成,分别作为攻击方和防守方,提交自己攻击和防守的截图 1)攻击方用nmap扫描(给出特定目的的扫描命令) 2)防守方用tcpdump嗅探,用Wireshark分析(保留Wireshark的抓包数据),分析出攻击方的扫描目 的和nmap命令 和赵京鸣一组,攻击机ip为222.28.132.218,靶机ip为222.28.132.98 首先查看了靶机的ip,然后进行ping通 靶机使用tcpdump嗅探,设置过滤条件,发现了攻击机的ip。 攻击机使用nmap的不同参数对靶机进行端口扫描 靶机使用Wireshark条件过滤攻击机发送的数据包,并进行分析 缓冲区攻击的原理 一. 缓冲区溢出的原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。 例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets

20169217 2016-2017-2 《网络攻防实践》第九周学习总结

大城市里の小女人 提交于 2020-02-08 04:33:33
实践内容 nmap扫描端口 首先查看windows靶机地址 ip地址为222.28.133.127 靶机使用的操作系统是windows 2000 使用nmap -O 222.28.133.127 查看靶机的活跃端口,同样可以查看其开设了那些服务 使用nmap -sS 222.28.133.127 查看其tcp端口 使用nmap -sU 222.28.133.127 查看其udp端口 接下来是linux靶机,其实linux靶机操作基本类似,所以我试着挑战一下难度,使用nmap扫描了一台正常的unbantu linux虚拟机 首先查看linux虚拟机IP地址192.168.200.3 接下来同样使用nmap 扫描linux靶机,这是我惊奇的发现linux靶机竟然所有端口都是关闭的,这也是我本次实践遇到的最大问题,为啥一台linux主机的端口在没有设置的情况下要全部关闭? 教材内容总结 谍件 谍件(Spyware)与商业产品软件有关,有些商业软件产品在安装到用户机器上的时候,未经用户授权就通过Internet连接,让用户方软件与开发商软件进行通信,这部分通信软件就叫做谍件。用户只有安装了基于主机的防火墙,通过记录网络活动,才可能发现软件产品与其开发商在进行定期通讯。谍件作为商用软件包的一部分,多数是无害的,其目的多在于扫描系统,取得用户的私有数据。 远程访问特洛伊 远程访问特洛伊RAT

Metaspolit

帅比萌擦擦* 提交于 2020-02-08 04:32:16
Metaspolit介绍 Metasploit是一款开源的安全漏洞检测工具,安全工作人员常用 Metasploit工具来检测系统的安全性。Metasploit Framework (MSF) 在2003年以开放源码方式发布,是可以自由获取的开发框架。它为渗透测试、shellcode 编写和漏洞研究提供了一个可靠平台。 Metaspolit安装 从官方网站 http://www.metasploit.cn 下载windows版本的安装版,直接安装即可。 温馨提示:请关闭防火墙和杀毒软件。 Metaspolit的使用 Metasploit目前提供了三种用户使用接口: Console模式:功能最全面,建议使用; GUI模式:用户友好度最高,但功能不是最完整的; CLI模式:命令行模式,用于批量处理。 Metaspolit的Console模式介绍 Console模式启动 通常启动较慢,需等待10分钟左右,开始界面如下: 加载完毕后如图所示: 常用指令介绍 A 帮助指令--- ?/help B 查看所有的漏洞脚本---show exploits C 查看某个脚本的信息---info exploit/windows/wins/ms04_045_wins 渗透过程演示 如果确定使用什么脚本进行攻击的时候,则用以下指令按步骤进行操作 1 使用某个脚本 use exploit/windows

关于缓冲区溢出的对策

ⅰ亾dé卋堺 提交于 2020-01-10 04:03:55
从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断缓冲区溢出是否发生。 StackGuard 在返回地址和缓冲区之间添加一段guard区,该guard区中可以由编译器存放一些不可预测的值,利用该guard区的值是否被篡改,若被篡改了,则可推断返回地址被修改,即可判断缓冲区溢出发生。在gcc编译器中,可以使用 -fno-stack-protector 来关闭SyackGuard。 利用如下代码探究StackGuard机制: # include <string.h> # include <stdio.h> # include <stdlib.h> void copy ( char * str ) { char buffer [ 12 ] ; strcpy ( buffer , str ) ; } int main ( int argc , char * argv [ ] ) { copy ( argv [ 1 ] ) ; printf ( "Return Properly\n" ) ; return 1 ; } 针对以上代码,在默认条件下编译以后(StackGuard机制开启),输入小于12字节参数时程序正常

实验:缓冲区溢出漏洞实验

自古美人都是妖i 提交于 2019-12-26 18:23:10
实验:缓冲区溢出漏洞实验 一、实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。 二、实验准备 系统用户名shiyanlou,密码shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在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: 三、实验步骤 1.练习一 :按照实验步骤进行操作,攻击漏洞程序并获得root权限。 sudo sysctl -w kernel.randomize_va_space=0 linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形

缓冲区溢出攻击试验(bufbomb.c)

こ雲淡風輕ζ 提交于 2019-12-20 23:52:03
本文的实验来源于CSAPP 《Computer Systems A Programmer's Perspective》 (深入理解计算机系统)一书中第三章的一个实验,即习题3.38。 作者给出了一个含有缓冲区溢出的程序bufbomb.c,你需要做的,就是注入给缓冲区些特殊的数据,到底利用缓冲区的目的。 在做这个题目之前,你当然要知道什么是帧栈结构(请参阅《深入理解计算机系统》第三章)或者之前的博文 栈帧&溢出 ,了解%ebp和%esp的含义 // bufbomb.c /* Bomb program that is solved using a buffer overflow attack */ #include < stdio.h > #include < stdlib.h > #include < ctype.h > /* Like gets, except that characters are typed as pairs of hex digits. Nondigit characters are ignored. Stops when encounters newline */ char * getxs( char * dest) { int c; int even = 1 ; /* Have read even number of digits */ int