2024XYCTFpwn题解
pwn-hello_world(签到)
泄露libc,栈溢出ROP即可。
EXP
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950from pwn import *from ctypes import *from libcfind import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux","splitw","-h"]debug = 0if debug: p = process('./pwn') elf = ELF('./pwn') # p = process('', env={'L ...
2024长城杯第二赛区初赛pwn部分题解
cardstore
发现存在格式化字符串漏洞,可以泄露libc地址
接着进入到3中,利用整形溢出,可以进行ROP,但是有canary,最开始想利用超长padding覆盖TLS,这样能绕过canary检测。但是尝试一段时间后,发现一直不行。
就更换思路,需要泄露canary。发现程序开始的时候,会进行
所以思路就是第一次泄露canary,然后利用栈溢出返回main函数,再次利用格式化字符串漏洞泄露libc基地址。然后再ROP即可getshell
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586from pwn import *from ctypes import *from libcfind import *from LibcSearcher import*import base64import syscon ...
house_of_cat
利用效果
House of Cat通过修改虚表指针的偏移,转而调用**_IO_wfile_jumps中的_IO_wfile_seekoff函数,然后进入到_IO_switch_to_wget_mode函数中来攻击,从而使得攻击条件和利用变得更为简单。并且house of cat在FSOP的情况下也是可行的,只需修改虚表指针的偏移来调用_IO_wfile_seekoff即可(通常是结合__malloc_assert**,改vtable为**_IO_wfile_jumps+0x10**)。
利用条件
1.能够任意写一个可控地址。
2.能够泄露堆地址和libc基址。
3.能够触发IO流(FSOP或触发__malloc_assert,或者程序中存在puts等能进入IO链的函数),执行IO相关函数。
利用原理
IO_FILE结构及利用
在高版本libc中,当攻击条件有限(如不能造成任意地址写)或者libc版本中无hook函数(libc2.34及以后)时,伪造fake_IO进行攻击是一种常见可行的攻击方式,常见的触发IO函数的方式有FSOP、__malloc_assert(当然也可以用puts等函 ...
house_of_apple2-xyctf
EXP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132# -*- coding: utf-8 -*-from pwn import *from pwn import p64,p32,u64,u32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64 ...
house_of_apple2打ORW
禁用了系统调用无法getshell。所以要打ORW。利用house_of_apple2这条链打ORW。
只需要将原来的system替换为magic_gadget(栈迁移的效果)。执行ORW
EXP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917 ...
house_of_apple2
house_of_apple2
利用条件
使用house of apple2的条件为:
已知heap地址和glibc地址
能控制程序执行IO操作,包括但不限于:从main函数返回、调用exit函数、通过__malloc_assert触发
能控制_IO_FILE的vtable和_wide_data,一般使用largebin attack去控制(或者伪造IO_FILE)
利用原理
stdin/stdout/stderr这三个_IO_FILE结构体使用的是_IO_file_jumps这个vtable,而当需要调用到vtable里面的函数指针时,会使用宏去调用。其中会对vtable进行检查,会判断vtable的地址是不是在一个合法的区间。如果vtable的地址不合法,程序将会异常终止。
观察struct _IO_wide_data结构体,发现其对应有一个_wide_vtable成员。
12345678910111213141516171819202122struct _IO_wide_data{ wchar_t *_IO_read_ptr; /* Current read ...
自定义堆
自定义的堆区,malloc和free以及bin链表都是自己定义的。
每次malloc和free之前都会判断图上malloc_hook和free_hook值是否为空,如果不为空,则跳转执行。
第一部分是程序已经malloc的,保存着后门函数。所以可以将bss段malloc_hook和free_hook内容填充为第一部分data地址,这样free_hook实际上就指向的是后门函数。
heap_listp+8处保存着free_list链表指针。是根据遍历这个链表找到合适堆块,如果大小合适就会分配出去。
EXP
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495from pwn import *from ctypes import *from libcfind import *f ...
伪造0x420大小chunk直接释放到unsortedbin中
ezheap
由于只能分配0x50大小的chunk,并且只有一次UAF,可以先利用UAF泄露heap地址,然后构造double_free。利用这个double_free分配到一个伪造的0x421大小的chunk,释放这个chunk,就能直接进入到Unsortedbin中,然后填充一下字符,泄露出libc。
之后重新构造一个double_free劫持free_hook即可
EXP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102# -*- coding: utf-8 -*-from pwn import *from pwn import p64,p32,u64,u32from ctypes import *from libcfind import ...
切割unsortedbin
存在UAF,glibc-2.31版本,存在tcache_key检测。
申请十个chunk,释放前7个填满tcachebin,然后释放第9个进入到unsortedbin中泄露libc。
接着释放第8个chunk,此时会和unsortedbin合并。
申请出tcachebin中的一个chunk,留一个tcachebin的位置利用double_free。
此时再次释放第9个chunk,就会将其释放到tcachebin中。
通过申请一个0x90的chunk,覆盖next指针为free_hook即可
EXP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879# -*- coding: utf-8 -*-from pwn import *from ctypes import *from libcfind import *from LibcSearcher ...
利用IO打onegadget
Glibc版本变化
随着glibc版本的变化,堆的打法限制也是越来越多。主要记录一下每个版本的大致差别
2.27 版本引入了tcache,同时在2.27的高版本引入了bk字段的flag用来防止double free
2.29 版本unsorted bin、house of force、house of storm等利用手段失效,off by null的利用手段更为复杂,setcontext函数汇编代码中rdi寄存器寻址变为rdx寻址,可以通过如house of pig或找一段gadget来实现沙盒绕过(也可以直接用堆栈结合)
2.32 加入了堆块fd异或操作,想要利用需要通过如UAF等漏洞先泄露异或key
2.34 取消了malloc_hook 和 free_hook,可以通过打IO或者堆栈结合的方式完成getshell
漏洞点
存在UAF
攻击思路
由于在glibc-2.34中没有malloc_hook和free_hook了,所以如果要篡改执行流的话,就可以利用申请栈空间,然后构造ROP。通过泄露libc地址,由于fd是被key异或过的,所以需要先将key泄露出来。然后伪造的f ...