其他分享
首页 > 其他分享> > 20212818 2021-2022-2 《网络攻防实践》实践九报告

20212818 2021-2022-2 《网络攻防实践》实践九报告

作者:互联网

一、实践内容

一)软件安全的概述

1.软件安全的威胁

2.软件安全的困境:为什么软件中会普遍地存在着安全漏洞呢?

3.安全漏洞类型主要存在如下几类:

(二)缓冲区溢出基本概念

1.缓冲区溢出

2.背景知识

        

3.缓冲区溢出攻击原理:根据缓冲区在进程内存空间中位置不同,分为栈溢出、堆溢出和内核溢出这三种具体的技术形态。

(三)Linux平台上栈溢出与Shellcode

1.Linux平台栈溢出攻击技术:NSR、RNS、RS三种模式。

2.Shellcode实现技术

                        

(四)Windows平台上栈溢出与Shellcode

1.栈溢出攻击技术:与Linux的攻击技术的差异主要体现在三个方面

(五)堆溢出

Linux在.data、.bss和heap中缓冲区溢出都称为堆溢出。
1.函数指针改写:需要被溢出的缓冲区临近全局函数指针存储地址,且在其地址方向。当缓冲区填充数据时,如果没有边界判断和控制的话,缓冲区溢出后就会自然地覆盖函数指针所在的存储区。攻击者只要能将改函数指针指向恶意构造的shellcode地址,在程序使用函数指针是调用原先期望的函数时,就会调用shellcode。

2.c++类对象虚拟函数表:C++类通过虚拟函数提供了一种Late binding运行过程绑定机制,编译器为每个包含虚拟函数的类建立起虚拟函数表、存放虚拟函数的地址、虚拟函数指针。对于使用了虚拟函数的机制,如果它的类成员变量中存在可被溢出的缓冲区,那么就可进行堆溢出攻击。通过覆盖类对象的虚拟函数指针指向一个特殊构造的虚拟函数表,进而转向执行恶意代码。

3.Linux下堆管理glibc库free()函数本身漏洞:Linux操作系统的堆管理是通过glicbc库实现的,主要目的是增加对多线程环境的支持,同时优化内存分配和回收的算法。

(六)缓冲区溢出攻击防御技术

 

二、实践过程

 

实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

 

 

任务一:

  手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

 

 

 

 输入vi pwn1

 

 输入指令%!xxd将显示改变为十六进制

 

 

 

 将d7修改为c3。定位到d按下r然后按c,定位到7按下r然后按3

 

 输入:%!xxd -r 恢复成十六进制,然后保存文件,执行pwn1。再次执行objdump -d pwn1查看main函数。可以发现已经修改成功

 

 

 

 

 

 执行pwd1发现确实成功了

 

 任务二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

  反汇编pwn1文件,命令为 objdump -d pwn1 ,可以看到 pwn1中所有的函数,包括getshell、foo、main。可以知道如果程序正常执行,会执行函数foo。foo函数的功能:将用户的输入再次输出。所以这里我们可以利用BOF漏洞,通过缓冲区溢出攻击的方式触发getshell函数。当foo函数的返回地址是0x080484ba,即foo函数执行完后会调用的下一条指令地址为0x080484ba。我们只需将这个地址替换为getshell函数的入口地址,就可以触发getshell函数。

 

   首先安装gdb,后面会用到。

 

  使用安装好的gdb调试分析pwn1 ,命令为gdb pwn1。

 

  运行这个文件 ,命令为:r。

 

   输入字符串,输入较短字符串时,程序可以正常结束运行,但是输入字符串较长时,会出现段错误。

 

        我们让它显示具体信息,命令为info r,可以看到现在EIP的内容是0x33333333。

 

   生成input文件,并设置特定的输入串,命令为:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

 

   通过命令ls查看当前目录下的文件,确定input文件已成功生成。查看input文件的16进制信息,命令为:xxd input。

 

   将input文件设置为文件pwn1的输入,命令为(cat input; cat ) | ./pwn1。

 

 任务三:注入一个自己制作的shellcode并运行这段shellcode

 

 

 

 

 

 

 

三、学习中遇到的问题及解决

 

四、实践总结

 

标签:函数,实践,20212818,地址,2021,Linux,缓冲区,Shellcode,溢出
来源: https://www.cnblogs.com/fairry/p/16273750.html