20232917白胤廷 2023-2024-2 《网络攻防实践》实践九报告

20232917白胤廷 2023-2024-2 《网络攻防实践》实践九报告

1.实践内容

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

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

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

三个实践内容如下:

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

2.实践过程

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

设置共享文件夹将pwn1文件导入主目录后并修改文件名为pwn20192402,输入:
objdump -d pwn20232917 | more
在这里插入图片描述
继续下拉,找到getshell、foo与main函数;由主函数我们可以看出main函数调用foo,相应的机器指令为“e8 d7ffffff”,其中“e8”为跳转的意思。本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行“EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,即为目标地址偏移量,41=0x29,80484ba+d7ffffff= 80484ba-0x29正好是8048491这个值,即为跳转的目标地址。那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。用Windows计算器,直接47d-4ba就能得到补码,是c3ffffff。注意计算时是小端模式低字节优先。

修改可执行文件,将call指令的目标地址由d7ffffff变为c3ffffff。
进入到文件的vi模式,输入:
Vim pwn20232917
在这里插入图片描述

按esc键退出,输入::%!xxd,以查看其十六进制
在这里插入图片描述
输入:/e8 d7,找到目标代码 在000004b0,记录目标位置在000004b0这行,找到目标,将光标移至d,按r键后修改为c,同理修改7为3:
在这里插入图片描述
输入::%!xxd -r,转换16进制为原格式
在这里插入图片描述
存盘退出。
对文件再次进行反汇编,找到主函数中之前调用foo的位置,发现call指令已经改为调用getshell了。运行后发现可以调用shell
在这里插入图片描述

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

进行反汇编,我们可以利用foo函数中的Buffer overflow漏洞,造成缓冲区溢出,来覆盖返回地址为主函数中的80484ba,从而调用getshell函数。

2.1确认输入字符串哪几个字符会覆盖到返回地址

输入:gdb pwn20232917
在这里插入图片描述
再输入r指令执行程序,我们可以尝试着输入一段字符串1111111122222222333333334444444412345678共40个字符
在这里插入图片描述
在这里插入图片描述
再输入info r查看寄存器信息发现正是之前0x34333231,即为4321的ASCII码,根据老师上课所讲的知识可以知道Linux地址是由高到低的,说明覆盖成功,之后的操作将其修改为getshell地址就能返回运行到getshell了。
由于是第32为之后的覆盖成功,能由此可见缓存区32个字节。

2.2构造输入字符串
由于小端模式我们将地址倒过来输入即可:(原为0804847d改为7d840408)
11111111222222223333333344444444\x7d\x84\x04\x08
再之后加一个\x0a表示回车就构造完成了。

在这里插入图片描述

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

在正式开始之前,我们需要对操作系统和程序进行一些设置便于找到我们注入的数据的地址
在这里插入图片描述
使用如下命令构建字符串并保存到input_shellcode中,其中前四字节还不确定,使用12 34h填充
在这里插入图片描述
接下来我们来确定\x4\x3\x2\x1到底该填什么。打开一个终端注入这段字符串:
在这里插入图片描述

再打开另一个终端,首先使用命令找到pwn1的进程号
在这里插入图片描述
再使用gdb调试该进程,然后反汇编foo函数,查看返回指令(ret)的地址,在返回指令的地址处设置断点,之后在另外一个终端中按下回车,然后再使用c使程序继续运行,待程序运行到断点处,查看此时的esp寄存器的值,获得我们注入的字符串的地址,我们使用如下指令查看该地址附近的数据,从0xffffd02c开始观察,可以发现数据采用小端字节序,并且将返回地址改为ff ff d0 30就可以让程序执行Shellcode,这样一来\x1\x2\x3\x4就应该修改为\x30\xd0\xff\xff,于是我们便重新利用perl语言,将返回地址修改正确,并在最后加上回车(0x0a),然后重新运行程序。
在这里插入图片描述

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

  • 问题1:虚拟机断网
  • 问题1解决方案:修改虚拟机网关
  • 问题2:在2.3时,使用命令execstack操作系统提示——无法定位软件包 execstack
  • 问题2解决方案:通过百度搜索,我找到了execstack的官方网站并成功找到了execstack的安装包,由于kali是Debian的发行版,所以选择了Debian版本的进行下载,具体下载地址见下面的链接https://pkgs.org/download/execstack
    下载到本地后,使用apt的命令即可完成安装

4.实践总结

在进行“注入一个自己制作的shellcode并运行这段shellcode”这项实验时,我因为弄不清楚原理照着实验指导照猫画虎导致了多次失败,幸亏在实践中搞明白了一开始的那一段攻击代码是中的起始的1234是存放覆盖ret地址的位置,在让我明白了第一次构造是尝试,第二次才是动真格的。
总之,此次实验不仅让我感受到Linux基本功还不够扎实,更表现了我动手能力的不足,希望在今后我能够收获知识与实践能力。

参考资料

-https://blog.csdn.net/u013782446/article/details/138595256
-https://pkgs.org/download/execstack

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值