20222813 2022-2023-2 《网络攻防实践》第9次作业

一、实践内容:

  1. 缓冲区溢出

计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

  1. shellcode

shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

  1. 反汇编

反汇编(Disassembly)是把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。

  1. 常用汇编指令

1、NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
2、JNE:条件转移指令,如果不相等则跳转。(机器码:75)
3、JE:条件转移指令,如果相等则跳转。(机器码:74)
4、JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
5、CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。CMP指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

二、实践过程:

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

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

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

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。
  1. 直接修改程序机器指令,改变程序执行流程

①知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
②学习目标:理解可执行文件与机器指令
③进阶:掌握ELF文件格式,掌握动态技术

下载目标文件pwn1到Desktop目录,执行unzip命令进行解压,然后使用objdump -d 20222813pwn1|more命令进行反汇编,并利用管道进行分页显示。

在这里插入图片描述

在这里插入图片描述

现需要修改main函数中call指令的地址,使其跳转到getShell函数,具体操作如下,将’D7’改成’C3’即可

在这里插入图片描述

输入指令"vi 20222813pwn1",使用vi文本编辑器查看该文件。之后输入指令":%!xxd",将显示模式切换为16进制模式。

在这里插入图片描述

然后查找要修改的内容"/e8 d7",找到对应数据。

在这里插入图片描述

将"d7"修改成"c3",每修改一个字符,按一个r,修改一次。

在这里插入图片描述

修改完毕数据后,输入指令":%!xxd -r"将文件恢复文本显示。

在这里插入图片描述

最后输入":wq"保存并退出。

再次输入指令"objdump -d 20222813pwn1 | more"查看反编译结果。可以看出已经调用了"getShell"函数。修改成功。

在这里插入图片描述

运行20222813pwn1,实验成功。

在这里插入图片描述

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

①知识要求:堆栈结构,返回地址
②学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
③进阶:掌握ELF文件格式,掌握动态技术

构造字符串,进行缓冲区溢出攻击。确认输入字符串哪几个字符会覆盖到返回地址

在这里插入图片描述

在这里插入图片描述

通过eip的值发现5678这四个数最终会覆盖到堆栈上的返回地址,只需把这四个字符替换为 getShell 的内存地址即可。
构造输入字符串
通过之前的反汇编可知替换为\x7d\x84\x04\x08即可修改返回地址,其中 \x0a 表示回车。

用指令xxd查看input文件的内容。

然后将input的输入,通过管道符“|”,作为20222813pwn2的输入。

在这里插入图片描述

执行ls命令,实验成功。

在这里插入图片描述

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

apt-get install execstack //安装execstack命令
execstack -s 20222813pwn3 //设置堆栈可执行
execstack -q 20222813pwn3 //查询文件的堆栈是否可执行

在这里插入图片描述

more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化

在这里插入图片描述

构造要注入的字符串地址,并开始注入攻击:

在这里插入图片描述

再开另外一个终端,使用ps -ef | grep 20222813pwn3找到对应的进程号为1398:

在这里插入图片描述

根据20222813pwn3的进程号使用gdb对其进行调试,通过设置断点,来查看注入字符串的内存地址。根据ESP的值查看当前栈顶的值为0x71687900,根据input_shellcode可知,shellcode就在其后(+4),所以地址应为0xffffd6a4

在这里插入图片描述

构造shellcode,将修改后的字符串地址作为20212806pwn3的输入,执行成功。得到shell,如下图所示:

在这里插入图片描述

三、学习中遇到的问题及解决:

  • 问题1:在运行程序时有时会遇到Permission denied错误
  • 问题1解决方案:为了获得执行权限,借助chmod指令修改文件权限即可,其中777是111,111,111,即获得可读可写可执行权限,再次运行程序就会发现程序可以运行了

四、实践总结:

本周学习了有关缓冲区溢出的相关知识和shellcode原理,学会了怎样去观察堆栈的变化,怎样去计算相关的地址。并学会了一些汇编语法,同时能正确构造payload进行bof攻击。总之还需要多实践,提高了对缓冲区溢出和shellcode的理解,更提高的自我学习的能力,让我受益匪浅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20222813杨皓清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值