缓冲区溢出
“正义与邪恶共存,邪恶推动正义的进步,正义迫使邪恶的升华,两者谁是谁非。是非只是它人的定义,两者都是正确的”
在我们调试程序的时候,我们如何去掉调试窗口中的CCCC的内容。
第一步:
打开项目属性------>c/c++----->代码生成-------->基本运行时检查设置为“未初始化的变量”------->\
安全检查“否”
第二步:
打开项目属性------>连接器----->高级------>随机基址为“否”---------->数据执行保护“否”
进行这些设计之后,我们就可以在调试窗口去掉了”cccc”。
缓冲区溢出:是指当计算机向缓冲区内填充数据位数时,超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。
扩展知识:
最常见的调用语法是C声明语法。一个C声明函数或cdecl函数中,参量在堆栈上以相反的顺序传递给函数(第一个参量被压入到堆栈的最后)。调用者清空先前压入堆栈的参量数目。
Stdcall(标准调用语法):被调用者清空压入堆栈的参量数目。几乎全部的WIN32 API都是用标准调用语法写的。
Naked:很少使用
快速调用语法:快速调用语法中,前两个传递给函数的参量直接被传递到寄存器中,这就意味着它们不需要被压入到堆栈中。
程序虚拟内存非配情况:(内存大小4GB)
空指针赋值区 | 0x00000000~0x0000FFFF |
用户空间地址 | 0x00010000~0x7FFFFFF(2GB) |
系统空间地址 | 0x80000000~0xFFFFFFFF |
用户地址空间包括堆栈段、堆地址空间、程序代码和各种其他段。
栈溢出
栈溢出是覆盖
#include "stdafx.h"
#include "windows.h"
void P()
{
printf("hello world\n");
system("pause");
}
void kk()
{
int a[5]={0};
a[7]=(int)P;
}
int _tmain(int argc, _TCHAR* argv[])
{
kk();
system("pause");
return 0;
}
堆是应用程序使用的一块内存区域,它在运行应用程序时动态分配。静态变量和使用malloc函数接口分配的数据一起存储在堆栈上。
Malloc调用Malloc函数将在堆栈中动态地分配n个字节。许多漏洞都与这种数据处理方式有关。
Memset/Memcpy调用Memset函数将用确定字节数的特定字符来填充堆缓冲区。调用Memcpy函数将堆上的一个缓冲区内的确定数目的字节复制到内存的一个缓冲区内。这个功能类似于strncpy函数的功能。
Sandbox 是一种用来控制代码执行的结构。在sandbox中执行的代码不会影响外部系统。用户需要运行可变代码时,这种结构对安全是很有用的。
Shellcode传统上,shellcode是执行shell的字节码。现在,shellcode有了更广泛的意思,可以定义一个成功exploit所执行的代码。多数shellcode的目的用于返回shell地址,但许多shellcode也有其他的目的。比如产生一个chroot shell 、建立文件、代理系统调用。
Exploit:的英文意思就是利用,它在黑客眼里就是漏洞利用。有漏洞不一定就有Exploit(利用)。有Exploit就肯定有漏洞。
SPI服务提供方接口,即Service Provider Interface(SPI),被用于设备与软件进行通信。SPI通常由硬件设备制造商编写,用于和操作系统通信。
堆栈:堆栈是用来存储临时数据的内存空间,它在程序运行期间不停地增长或收缩。一般的缓冲区溢出就发生在内存的堆栈空间。当缓冲区超载时,溢出的数据将覆盖被保存的返回地址,从而使恶意用户获得对程序的控制。
缓冲区溢出:当向一个已分配了去顶存储空间的缓冲区内赋值多于该缓冲区处理能力的数据时,将发生缓冲区溢出。溢出包括堆溢出和堆栈溢出。
堆腐烂 堆溢出通常被更准确称为堆腐烂缺陷。因为当堆栈上缓冲区溢出时,数据经常溢出到其他的缓冲区;而在堆上,数据则溢出到内存上,不管这些内存是否重要/有用/可利用。堆腐烂缺陷是发生在内存上对区域的漏洞。这些缺陷可以以多种形式出现,包括malloc函数的实现、静态缓冲区的溢出。和堆栈不一样,需要很多条件都满足时,才可以利用一个堆腐烂缺陷。
净荷:
“杀人的刀”
注入向量是一种传统的操作代码(opcode),需要用它来控制远程机器上的指令指针。这与机器和目标相关。注入向量的关键在于执行净荷。另一方面,净荷更像一种病毒;它可以在任何地点、任何时间工作,不论它是如何被植入到远程机器上的。如果净荷不以这种方式工作,它就是不纯洁的。如果为军事用途编写缓冲区溢出,要求纯净的净荷,这是一种得到代码的好方法。
BSS溢出:BSS是静态数据被保存的内存段。
字符串的大小是:字符串空间-1 最后一个字符应该为字符串的标准结束字符。
反转工程学:这个进程需要将二进制代码反编译到汇编语言列表中。
特定缺陷二进制审核:这个方法包括一个分析器应用程序,读取编译好的程序并根据某些提示进行扫描,以找到缓冲区。