20212923 2021-2022-2 《网络攻防实践》第九次作业

20212923 2021-2022-2 《网络攻防实践》第九次作业

实践九:软件安全攻防--缓冲区溢出和shellcode

课程:《网络攻防实践》

班级: 2129

姓名: 王文彬

学号:20212923

实验教师:王志强

实验日期:2022年5月13日

必修/选修: 选修

一.实践内容

1. 实践要求介绍

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

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

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

  • 动手实践任务一

    • 任务:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 动手实践任务二

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

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

缓冲区溢出

  • 知识点总结:
  1. 缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。主要危害有以下亮点:

    • 1、程序崩溃,导致拒绝服务
    • 2、跳转并且执行一段恶意代码
    • 原因在于程序中没有仔细检查用户输入。
  2. 缓冲区:缓冲区可以理解为一段可读写多内存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写内存中已经被蓄意设定好的恶意代码。

  3. 按照冯·诺依曼存储程序原理,程序代码是作为二进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。

  4. 最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。


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

(1)首先我们先利用objdump命令对于pwn1程序进行反编译,查看getShell函数、main函数和foo函数。

从上图中可以看出0x8048491-0x80484ba=0xffffffffffffffd7,和图中main函数中地址为0x80484b5显示一样,因此我们只要把d7变为getshell函数的地址就可以实现攻击,因此我们计算0x804847d-0x80484ba=0xffffffffffffffc3,把d7换成c3就可以实现。

(2)利用vim编辑器进行修改

(3)打开文件后显示的乱码文档,我们利用%!xxd命令进行16进制的转化,转换成我们可以看懂的文档,如下图:

(4)找到d7的位置进行修改,修改为c3,如下图:

(5)然后保存后退出运行,发现运行以后出现$,进入shell,攻击成功。


任务二:利用foo函数的Bof漏洞,构造返回地址

(1)首先在gdb调试中借助一个足够长的参数去试,借助debug工具才能看出那部分数据是溢出的。
里面用到info命令查看eip寄存器(返回地址)的值,注意到0x35就是‘5’的ascll码,因此可以确定地址应该在8个5的位置,于是再输入一组测试,1111111122222222333333334444444412345678来确定4字节地址的具体位置。

(2)此时就可以确定输入32字节之后的4个字节就是我们要覆盖的返回地址所在的位置了,接下来就是把原来的地址改为getshell函数的起始地址。从之前逆向的反汇编中我们知道getshell的起始地址是0x0804847d,但是直接按这个顺序输入会错,因为从上图中看出当输入是1234时eip寄存器中的值却对应的是4321,这是因为栈顶是低地址的缘故,所以0x0804847d也需要反着输入,即0x7d840408。


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

(1)准备工作

(2)首先需要确定我们插入shellcode后的地址在哪,我们利用perl语句:perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x00"' > input_shellcode进行实验,查看\x4\x3\x2\x00这四个字节在哪里;

(3)进行gdb调试,利用attach命令找到pwn1程序,并且对于foo函数进行反编译,反编译以后设置一个断电,以寻找到插入shellcode的地址,我们在foo函数返回点设置断点,继续运行以后,可以查看当前esp指针指向哪里,查看偏移,然后发现\x4\x3\x2\x00成功覆盖。

(4)接下来就构造输入数据,先按前一步把eip和前32字节内容写到input2文件中,然后编写shellcode。运行后发现攻击效果已经达成。

二、 实验过程中遇到的问题和解决过程

  1. 在第一个实践过程中,在修改后,保存可执行文件以后却不能成果运行,提示说:“格式有误”
    • 我们需要在vim中进行%!xxd -r 进行反转后才能够进行保存,这样就可以进行运行了。

三、感想

在此次实践中,我们能够进一步了解不同的攻击手段,同时还增长了Linux系统操作的更多知识。

四、参考文献

什么是缓冲区溢出?有什么危害?原因是什么?

posted @ 2022-05-13 16:13  lalalaouye  阅读(32)  评论(0编辑  收藏  举报