栈溢出学习(二)Return2Libc
跟随教程https://sploitfun.wordpress.com/2015/
此次实验参考https://sploitfun.wordpress.com/2015/05/08/bypassing-nx-bit-using-return-to-libc/
又看到一个好的博客,也是栈溢出系列:https://www.ret2rop.com/2018/08/return-to-libc.html
NX保护机制
NX保护机制原则为可写与可执行互斥,这就导致我们之前在栈上的shellcode不可以被执行,因此我们采用return2libc进行攻击
实验环境
Ubuntu12.04
漏洞代码:
//vuln.c
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[]) {char buf[256]; /* [1] */ strcpy(buf,argv[1]); /* [2] */printf("%s\n",buf); /* [3] */fflush(stdout); /* [4] */return 0;
}
较于之前的漏洞代码,增加了fflush函数的调用,主要是为了向我们提供sh字符串。
编译命令
#echo 0 > /proc/sys/kernel/randomize_va_space
$gcc -g -fno-stack-protector -o vuln vuln.c
去除了-z execstack
这一编译命令,表示开启NX保护机制。
我们可以用一下命令来查看栈上代码是否可执行
$ readelf -l vuln
...
Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignPHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1[Requesting program interpreter: /lib/ld-linux.so.2]LOAD 0x000000 0x08048000 0x08048000 0x00678 0x00678 R E 0x1000LOAD 0x000f14 0x08049f14 0x08049f14 0x00108 0x00118 RW 0x1000DYNAMIC 0x000f28 0x08049f28 0x08049f28 0x000c8 0x000c8 RW 0x4NOTE 0x000168 0x08048168 0x08048168 0x00044 0x00044 R 0x4...GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4GNU_RELRO 0x000f14 0x08049f14 0x08049f14 0x000ec 0x000ec R 0x1
$
可以看到GNU_STACK权限字段没有X(X表示可执行)。如果安装了gdb peda插件,我们可以用checksec命令查看该代码的保护机制:
Return2Libc思想
为了绕过NX保护机制,我们此次采用Return2Libc技术,主要思想就是之前的return address改成我们shellcode的起始地址,但那个是属于栈地址,现在我们找一个可执行的函数,把他的地址放在return address那里,如果需要的话,再给他传个参数,通常这个函数我们用libc里面的函数,如system、execv等,此次我们通过调用system(’/bin/sh’)函数来获取shell权限。
本次攻击需要以下三步:
找到buf起始地址到返回地址的空间大小
参见栈溢出学习(一)
找到system的地址
找到libc起始地址和system偏移地址
ldd vuln
找到libc起始地址readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
通过gdb直接找到system地址(注意需要先运行程序)
gdb-peda$ p system $1 = {<text variable, no debug info>} 0xb7e5f460 <system>
其实可以看到第一个方法得到的起始地址 + 偏移地址和第二个方法直接得到的system地址不一致,原因todo
通常我们在gdb-peda中使用
vmmap
(也要先运行程序)或者gdb中如果没有插件在gdb中info proc mapping
查看动态链接库地址,这里具有x权限的是我们想要的,他的起始地址为0xb7e20000,加上上一步read -s得到的偏移地址0x0003f460,就等于p system直接得到的0xb7e5f460啦。找到参数"/bin/sh"的地址
暴力搜索
(gdb) x/500s $esp
在栈中找一下"/bin/sh"字段,可以找到存在"/bin/bash"字段。SHELL=占了6个字节,因此我们"/bin/bash"起始地址为0xbffff581
但这个地址对我不管用
栈溢出学习(二)Return2Libc相关推荐
- C#多线程学习(二) 如何操纵一个线程
C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...
- spring security 学习二
spring security 学习二 doc:https://docs.spring.io/spring-security/site/docs/ 基于表单的认证(个性化认证流程): 一.自定义登录页 ...
- STL源码剖析学习二:空间配置器(allocator)
STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...
- mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...
MySQL 基础学习二:创建一个用户表,并 增删改查 提示:MySQL 命令建议都用大写,因为小写运行时,还是翻译成大写的. 第一步,创建一个用户表 1,打开控制台,进入数据库 C:\Users\Ad ...
- OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()
OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...
- OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()
OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...
- OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...
- OpenCV学习(二十) :分水岭算法:watershed()
OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...
- OpenCV与图像处理学习二——图像直方图与色彩空间
OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...
最新文章
- python入门基础代码图-适合Python入门的5本基础书籍
- vue 取数组第一个值_vue遍历对象中的数组取值示例
- python 字典由值找键,从Python中的Dictionary中的值获取键
- SQL Server 数据库角色简介
- cratedb导入json文件
- mysql 1053错误,无法启动的解决方法
- python查找第二次输入字符串在第一次字符串中出现的次数
- apt-get 更新源推荐
- Adobe Flash地图控件AnyMap
- html5两个静态页面传值,如何使用HTML5Viewer 进行参数传递
- 使用ZooKeeper ACL特性进行znode控制
- linux 命令安装 wine,如何在Ubuntu 18.04 LTS上安装Wine
- sql 随机函数newid()
- WPS2012专业版序列号
- gensim实现TF-IDF和LDA模型、sklearn实现聚类
- 一些流行的颜色及其RGB值
- blos硬盘启动台式计算机,怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法...
- delphi控件属性和事件
- 水下航行器简介及水下面临的挑战
- python_6_17
热门文章
- C#多线程学习(二) 如何操纵一个线程