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

在本次实验,我学会了如何通过三种方式实现攻击的操作。分别是直接修改文件内容直接跳转到另外一个函数、利用foo函数的漏洞直接跳转到另一个函数以及注入一个自己制作的shellcode并运行这段shellcode,接下来我将详细介绍我本次的实验过程。

1.实验内容

1.1 实验目标

在本次实验中,我学会了很多基本的Linux指令的使用方法以及Shellcode的构建方式,并更加充分的明白缓冲区溢出的相关原理,还学会了如何在一台linux系统上开放一个端口等待别的主机链接。

2.1 汇编指令机器码

汇编指令含义机器码
NOP一种机器语言指令及其汇编语言助记符、编程语言语句或不执行任何操作的计算机协议命令0x90
JNE当执行到这条语句时,如果标志位ZF=0,则跳转,反正,不跳转0x75
JE通过ZF标志位是否跳转,当执行到JZ或者JE指令时,如果ZF=1则跳转,如果ZF=0,不跳转0x74
JMP无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量0xE9、0xEA、0xEB
CMP指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数0x38、0x39、0x3A、0x3B、0x3C、0x3D

1.3 管道

shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的

1.4 BOF

BoF,Buffer Overflow 是所有溢出漏洞的统称。我们这篇文章在实践环节要讨论的,是基于栈的溢出(Stack Overflow)。我们来看一下 BoF 具体有哪些类型。
栈溢出 Stack Overflow,基于栈的溢出,利用不安全方法,通过写入指定长度的数据到栈空间,从而做到对程序跳转地址的控制,执行指定的代码。

1.5 重定向

输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

1.6 GDB和VI

GDB是一种调试工具,vi是文档查看的工具,我在此次实验中并没有使用vi,而是wxhexeditor。

2.实验过程

2.1 直接修改程序机器指令,改变程序执行流程

主要是理解可执行文件与机器指令,掌握反汇编技术。

2.1.1 查看文件基本功能

这里使用到了反汇编技术。

objdump -d pwn20202418 | more

在这里插入图片描述
在这里插入图片描述

在主函数中,有call 804847d是汇编指令,是说这条指令将调用位于地址804847d处的getshell函数,其对应机器指令为“e8 c3ffffff”,e8即跳转之意。这个是我修改后的文件内容。

2.1.2 修改文件内部数据,使其调用getshell函数

打开wxHexEditor,按ctrl+f查到E8D7,修改D7为C3。
在这里插入图片描述

在这里插入图片描述
原本主函数调用foo函数,现在变成了getshell函数。

2.1.3 输入ls验证是否跳转成功

在这里插入图片描述
跳转成功!

2.2 BOF攻击的实现

在这里插入图片描述

在foo函数中,lea留下了0x1c的缓冲区空间,因此我们想要通过缓冲区溢出的方法,输入一个很长的字符串,成功覆盖下一条mov语句的内容。

2.2.1 确定输入的那一部分能够覆盖下一条语句

在这里插入图片描述
在这里插入图片描述
通过输入1111111122222222333333334444444455555555和1111111122222222333333334444444412345678,此时寄存器的值变成了5555和1234,因此第33、34、35、36这四个数字会覆盖下一条语句的地址。

2.2.2 用什么来覆盖

在这里插入图片描述
由于我们要跳到geishell函数,肯定要用getshell函数这个地址来覆盖,因此我们把第32-35这四位的数字改成getshell函数的地址即可。

2.2.3 构建输入字符串

因此我们只需要构建任意32位+getshell地址即可,由于在堆栈中,参数是逆向排列的,因此我们要逆向输入地址,所以我构造了攻击字符串11111111222222223333333344444444\x7d\x84\x04\x08\x0a。在利用xxd发现内容无误后,利用管道作为程序的输入,最后发现成功进入到了shell!
在这里插入图片描述
在这里插入图片描述

2.3 注入Shellcode并执行

从实验指导书中我们可以知道。shellcode就是一段机器指令(code)
通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

2.3.1 准备工作

在实验开始前,要设置推展可执行并关闭地址随机化,这些功能的实现要依赖于一个prelink的包。
在这里插入图片描述
在这里插入图片描述

2.3.2 “坑”

我们先使用了nops+shellcode+retaddr的方法尝试攻击。nop一为是了填充,二是作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shell
先构造如下字符串:

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

在这里插入图片描述
然后攻击后查看地址,启动另外一个终端来调试这个程序。
在这里插入图片描述
结果并没有成功,查看老师的调试过程后,发现应该是我的代码在堆栈上,当前栈顶也在这,push后指令就被自身覆盖了,出现段错误。

2.3.3 另外一种攻击方法

采用结构为:anything+retaddr+nops+shellcode。
回到调试那一步
在这里插入图片描述

看到 01020304了,就是返回地址的位置。shellcode就挨着,所以地址是 0xbffff060。因此我们构建如下字符串32个A+getshell地址,从而实现跳转到shell中。
在这里插入图片描述
如图所示,构建好攻击payload后,输入ls,成功输出对应的列表内容!
至此,搭建payload攻击成功!

2.4 结合nc模拟远程攻击

我在我的电脑上开了两台虚拟机,都使用了桥接模式,能够成功让主机和两台虚拟机处于同一网段下。
主机A提供一个有漏洞的网络服务:
在这里插入图片描述
主机B发起连接并攻击:
在这里插入图片描述
发现ls后成功获得了主机A的列表!至此nc模拟远程攻击也成功结束!

3.问题和解决方案

问题一: 无法正常使用:%!xxd通过vim查看16进制的文件内容
解决方法: 安装wxHexEditor,通过这个软件来查看修改即可

问题二: 在第一次实验时使用了Ubuntu系统,将pwn1文件通过QQ邮箱传进去后竟然内容发生了改变(功能没有改变)。
解决方法: 原因尚不明确,换成kali系统后成功解决,但应该不是系统的问题。

**问题三:**无法gdb
解决方法: 尝试毕辰成同学在群里发的解决方法即可。

sudo apt-get -y update
sudo apt-get install gdb

4.实验感想

在这一次的实验中,首先是原理没有弄明白,第一次做的完全不知道他在干什么,机械的输入指令,像无头苍蝇一样。在第二次重新做的时候,突然有了很大的感悟,起码弄明白我每一步都在干什么了,能对一些代码出错做一些改动,最后顺利完成了实验。
通过这一次的实验,我通过了三种方法实现了对一个可执行性文件的攻击,做了一个类似于黑客的事情,收获颇丰!同时还熟悉了markdown的格式,找到了当时上王老师python选修课的感觉??在今后的网络攻防实验中,我要多加思考,争取在第一遍就能够理解实验的要求和目的,明白每一步到底是要干啥。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值