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

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

1.实验内容

  • BOF基本原理:堆栈、汇编语言、机器指令、EIP寄存器、返回地址
  • Linux基本操作
  • 基本的shellcode
  • Bof攻击防御技术

2.实验过程

2.1手工修改程序机器指令,改变程序执行流程,直接跳转到getShell函数

2.1.1反汇编1linux可执行文件并分析

将linux可执行文件pwn1改名为20222424,并保存在/home/kali/moushutong/目录下,反汇编:

getShell函数部分:

foo函数部分:

main函数部分:

可以看到在main函数中80484b5这一行,汇编指令“call 8048491”调用了位于地址8048491处的foo函数,其对应的机器指令即为“e8 d7ffffff”,“d7ffffff”是补码,表示-41,41=0x29,80484ba+d7ffffff=80484ba-0x29正好是foo函数的地址8048491,想要main函数调用getShell函数,只需将“d7ffffff”改为“804847d(getShell函数地址)-80484ba”即可,计算得到应改为“c3ffffff“。

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

将可执行文件20222424复制一份到20222424_1:

进入vi编辑器:

按ESC键,将显示模式切换为16进制模式:


查找要修改的内容:

修改d7为c3:

转换16进制为原格式并保存:

2.1.3 检查修改后的可执行文件是否调用getShell函数

反汇编可执行文件:


可以看到main函数成功调用getShell函数,此时运行下改后的代码,会得到shell提示符#:

至此,手工修改可执行文件成功!

2.2利用foo函数的BOF漏洞,构造攻击输入字符串,覆盖返回地址,触发getShell函数。

2.2.1利用gdb确认如何覆盖返回地址

使用gdb调试可执行文件,输入字符串,观察返回地址的覆盖情况:



可以看到如果输入字符串1111111122222222333333334444444412345678,那1234四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。只要把这四个字符替换为”0804847d“(getShell 的内存地址),输给可执行文件,就会运行getShell。再进一步,我们看到覆盖的顺序和输入的顺序是相反的,所以最终的字符串应该是”11111111222222223333333344444444\x7d\x84\x04\x08“。

2.2.2构造输入字符串

使用Perl生成包含字符串的文件:

使用16进制查看指令xxd查看input文件的内容是否如预期:

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

至此,构造字符串进行BOF攻击成功!

2.3注入Shellcode并执行

2.3.1准备工作

设置堆栈可执行:

关闭地址随机化:

2.3.2构造要注入的payload

使用anything+retaddr+nops+shellcode的结构:

注入这段攻击buf::

再开另外一个终端,用gdb来调试20222424这个进程,先找到进程号:

启动gdb调试这个进程:

通过设置断点,来查看注入buf的内存地址:

在另外一个终端中按下回车,再输入C:

这里就能看到 01020304了, 0xffffcfbc 即为返回地址的位置。shellcode挨着,所以地址是 0xffffcfc0,再次修改构造的字符串:


注入这段攻击buf:

至此,注入Shellcode成功!

3.问题及解决方案

  • 问题1:运行可执行文件时权限不够:

  • 问题1解决方案:给文件添加可执行权限:

  • 问题2:系统未安装gdb

  • 问题2解决方案:更新已安装软件包并安装gdb

  • 问题3:使用gdb调试可执行文件时权限不够:

  • 问题3解决方案:给文件添加可执行权限:

  • 问题4:系统未安装execstack包,并且安装时失败,定位不到软件包。

  • 问题4解决方案:



4.学习感悟、思考

  • 在手工修改可执行文件的过程中,通过反汇编,我可以直接地看到汇编语言、机器指令和寄存器使用。它们反映了可执行文件的结构功能、函数调用和控制流。通过分析文件反汇编,我逐渐明白了main函数如何通过跳转指令和地址来调用foo函数。在此基础上,根据相同的原理可以计算出调用getShell函数的跳转地址。最终成功验证了直接修改程序机器指令,可以改变程序执行流程,来达到调用其他函数的目的。这是我首次反汇编的经历,提高了我对汇编语言、机器指令的理解与掌握。
  • 通过本次实验中的BOF攻击,我对BOF攻击的过程和原理有了更加深入全面的理解。首先通过gdb调试工具,我可以多次输入不同字符串来观察返回地址的覆盖情况。结合堆栈结构、返回地址的知识,可以确认具体是字符串里的哪几个位置最终会覆盖到堆栈上的返回地址,进而改变函数调用。此时将getShell 的内存地址放到该位置,就会运行getShell。在明确做法后,我首次使用Perl生成了包含字符串的文件,并通过管道符“|”,作为可执行文件的输入,成功触发了getShell函数,实现了BOF攻击。
  • 进行注入Shellcode实验让我对恶意代码执行的原理有了更全面的认识。首先我了解了最基本的shellcode知识,通过学习通老师录制的视频学习了Linux下两种基本构造攻击buf的方法。在注入攻击buf后,在另一个终端gdb调试,通过设置断点,来查看注入buf的内存地址。通过返回地址的位置,就可以推出shellcode地址,根据地址正确构造payload进行BOF攻击 。
  • 在本次实验过程中,我也遇到了各种各样的问题,但大部分问题原因比较简单,容易解决。比如增加文件权限、安装/更新软件包。还有一些值得注意的细节,是在本次实践中遇到的小挫折,以后可以总结避免。例如在vi编辑器中查找“e8d7”时,e8和d7之间是有空格的,如果查找命令里没有空格就无法找到。还有注入攻击buf后,不可以再按一次回车,否则就找不到可执行文件的进程号了。而真正需要时间的,是在成功操作的基础上,理解每一步指令的意义,以及背后的知识和原理。此外,本次实践是在非常简单的一个预设条件下完成的,我们在LinuxX32环境下关闭了堆栈执行保护、关闭了地址随机化,而在现实中我们有很多BOF攻击防御技术可以让攻击更加困难。但现在BOF攻击仍然被广泛使用,需要我们进一步学习BOF攻击和防御正反两面的技术。
posted @ 2024-10-03 14:02  MOXde小苏打  阅读(53)  评论(0)    收藏  举报