SEED实验——return-to-libc实验
实验概述
本实验的学习目标是让学生获得缓冲区溢出攻击的一种有趣变体——return-to-libc攻击实验的亲身体验。这种攻击可以绕过目前在主要linux操作系统中实现的现有保护方案。利用缓冲区溢出漏洞通常的方法是使缓冲区溢出,然后在溢出部分的返回地址指向一段恶意的shellcode,使程序跳转到存储在堆栈中的shellcode。为了防止这些类型的攻击,一些操作系统允许管理员关闭堆栈的可执行功能。因此跳转到shellcode将导致程序失败。不幸的是,上述保护机制不是足够安全的。存在一种成为return-to-libc攻击的缓冲区溢出攻击的变体,其不需要可执行堆栈,甚至不需要shellcode。相反,它会导致受到攻击的程序跳转到一些现有的代码。例如已经加载到内存中的libc库中的system()函数。在这个实验中,学生被给予一个包含缓冲区溢出漏洞的程序,他们的任务是利用该漏洞,开发一个返回到libc库函数的攻击,最终获得root权限。除了这些攻击之外,学生们还将参与学习在ubuntu中实施的防止缓冲区溢出攻击的几项保护措施。学生需要评估方案是否有效,并解释评估过程。
第二部分:实验任务
该实验共有三个任务:
- 漏洞利用
- 地址随机化
- StackGuard保护机制
任务一:漏洞利用
1.编译代码是关闭地址随机化机制和非执行栈机制
sudo sysctl -w kernel.randomize_va_space=0 //注意:这里等号和0之间不能有空格
在进行代码编译时,加上-fno-stack-protector,即可关闭ubuntu上StackGuard保护机制,加上-z -execstack/noexecstack即可打开或关闭可执行栈的机制。
在本实验中,我们按照如下命令编译含有缓冲区溢出漏洞的代码段:
su root
gcc -fno-stack-protector -z noexecstack -o retlib retlib.c
chmod 4755 retlib / chmod u+s retlib
exit
2.获取/bin/sh地址
为了获取/bin/sh的内存地址,需要编写一个程序。
//getenvaddr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char const *argv[])
{
char *ptr;
if(argc<)
{
printf("Usage: %s <environment var> <target program name>\n", argv[]);
exit();
}
ptr = getenv(argv[]);
ptr += (strlen(argv[]) - strlen(argv[])) * ;
printf("%s will be at %p \n", argv[], ptr ) ;
return ;
}
其中,getenv的参数为一个环境变量,因此我们需要创建一个环境变量来记录路径export BIN_SH="/bin/sh"。调用程序./getenvaddr BIN_SH ./retlib得到/bin/sh的地址。

如上面截图所示,/bin/sh的地址为:0xbffffe39。
3. 获取system()和exit()地址
这两个程序是驻留在内核态的,所有程序共享内核态的函数,因此我们可以用gdb来获取这两个程序的地址。

如上图所示,在main函数设置断点,然后运行,运用gdb调试命令,我们可以得到system()函数的地址是0xb7e5f430,exit()函数的地址是0xb7e52fb0。
将上述获得的三个地址写到代码中,
第三部分:
实验指导:了解函数调用机制
3.1 获取libc库函数的地址
用gdb命令进行获取。
3.2 将shell字符串放在内存中
本实验的一个挑战是将字符串“/bin/sh”放入内存中,并获取其地址。这可以使用环境变量来实现。执行C程序时,它会继承执行它的shell的所有环境变量。环境变量SHELL直接指向/bin/bash并且环境变量同时也被其他程序需要。所以我们引入一个新的shell变量MYSHELL,并指向zsh。
$ export MYSHELL = /bin/sh
我们将使用该变量的地址作为system()函数调用的参数。这个变量的位置在内存中使用以下代码就可以发现:
void main()
{
char 8shell = getenv("MYSHELL");
if(shell)
prinf("%x\n",(unsigned int)shell);
}
如果地址随机化被关闭,将会发现打印出的地址是相同的。然而,当您运行漏洞程序retlib时,环境变量的地址可能与通过运行上述程序获得的地址完全相同。当您更改程序名称时,这样的地址甚至会更改(文件名中的字符数不一样)。好消息是,shell的地址将与上述程序打印出来的地址相当接近。因此,您可能哟啊尝试几次才能成功。
3.3 理解栈
要知道如何进行return-to-libc攻击,必须了解堆栈的工作原理。我们使用一个小程序来了解函数调用对堆栈的影响。
/* foobar.c */
#include <stdio.h>
void foo(int x)
{
printf("Hello world: %d\n", x);
}
int main()
{
foo(1);
return(0);
}
我们可以用“gcc -S foobar.c”来将程序编译成汇编代码。
SEED实验——return-to-libc实验的更多相关文章
- 20145307陈俊达《网络对抗》shellcode注入&return to libc
20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...
- 20175212童皓桢 Java实验二-面向对象程序设计实验报告
20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告
20175316 盛茂淞 2018-2019-2 <Java程序设计>实验二 面向对象程序设计 实验报告 (一)单元测试 在 IDEA中我们把产品代码放在src目录中,把测试代码放在tes ...
- 20165230 《Java程序设计》实验四 Android程序设计实验报告
20165230 <Java程序设计>实验四 Android程序设计实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导 ...
- 20169205 2016-2017-2 实验四 SQL注入实验
20169205 2016-2017-2 实验四 SQL注入实验 实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框. ...
- 实验 3:Mininet 实验——测量路径的损耗率
实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设 定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 实验任务 h0 向 ...
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...
随机推荐
- 单机多es容器服务部署的网络模式
3.1 Bridge模式的拓扑 当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交换机 ...
- 蓝盾杯writeup
由于比赛时只给了内网,web题目无法复现,这里就简单写一下misc的部分题目 1.眼花了吗 (默默吐槽居然是来自实验吧的原题) 提示:当眼花的时候会显示两张图,可以想到应该是包含双图的情况 用fore ...
- maven父子模块deploy 问题
1.问题描述:直接 deploy 子某块,但第三者确不能引用 jar(jar down不下来,但pom不报错) 原因:父子模块项目必须保证父模块pom deploy后,再 deploy 子模块才能被引 ...
- session前后台交互
下面是需求需要,不同的人群进来显示不同,但是还必须是这个走到哪都的存在,不能说点击别的页面,下面红框处的数据就没有了,必须是存在的并且登陆的类型不一样,显示的也不一样,开始的时候想到的是直接调用方法, ...
- node 创建
下载 node : 注意选项 ADD PATH 配置环境变量 node -v npm -v 检查创建一个服务器 : //创建一个服务器 127.0.0.1:8888 var http = requir ...
- eclipse下properties文件中文乱码的解决方案
今天在工程下编辑.properties文件时输入了中文然后就保存出错,弄了好久才搞定!大家瞄瞄 在中文操作系统下,Eclipse中的Java类型文件的编码的默认设置是GBK,但是对Properties ...
- 【算法】Attention is all you need
Transformer 最近看了Attention Is All You Need这篇经典论文.论文里有很多地方描述都很模糊,后来是看了参考文献里其他人的源码分析文章才算是打通整个流程.记录一下. T ...
- Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
直奔主题 如何设置WordPress在 Nginx下的伪静态 第一步:按照文章名为例,登陆后台按照箭头顺序修改固定连接,点击保存更改 第二步:登陆宝塔面板后台,按照文件路径 找到属于要配置域名的con ...
- 烽火2640路由器命令行手册-12-IBM网络配置命令
IBM网络配置命令 目 录 第1章 DLSW配置命令... 1 1.1 DLSW配置命令... 1 1.1.1 dlsw local-peer 1 1.1.2 dlsw remote-peer 3 ...
- pg 生成数据字典
select (select relname||'--'||(select description from pg_description where objoid=oid and objsubid= ...