DASCTF 2023 Apr 月赛 Pwn WriteUp
DASCTF 2023 Apr 月赛 Pwn WriteUp
下午改签五一假期车票耽误了好久,就出了两个。
four
所以拉屎之后一定要记得冲
有一个可以往栈上写一大堆东西的分支。
有一个可以打开文件的分支,但看起来似乎只能打开output.txt。
但既然变量都在栈上,且没memset(0,dest,sizeof(dest))
,假设我先往可能是dest位置的内存区域喷射flag
,再在进入打开文件分支的时候输入output.txt
,再在后续的处理中选择不写入,文件描述符就会被保留。
再进入另一个分支,想办法把flag
读进来,注意到前面循环的三坨if
分别处理了read
的三个参数。以>
为分隔符,将~
后的数字作为第一个参数fd,将:
后的内容顺序取3个byte作为第二个参数buf
,将@
和*
中间的1个字符取其ascii码值作为第三个参数nbytes
。
然后常规stack smash
,覆盖argv
即可。
似乎覆盖长度过大,到了/超过envp
会炸,待研究。
|
|
书鱼的诱惑
hint:
- fake fastbin chain reverse into tcache
- 劫持libc中的got表
- socket 反弹flag
好了,算法题退化为大模拟(不是
一共2次show,9次delete,只能加0x30大小的堆块,delete处存在UAF,没有edit。
只有小堆块,没法自定义size,单从tcache
出发就没什么搞头了。
但是,一个堆块可以同时存在于tcache
和fastbin
中,达到double free
的效果。当tcache
中的堆块被全部取出时,对应大小fastbin
中的堆块会被反向甩入对应tcache_bin
。
如此,我们便可以对堆链进行布局。利用double free
改写堆块fd指针,在fastbin
中构造一条链。然后在fastbin
进入tcache
之后进行进一步利用。
我们再来看看程序的限制条件。
首先看show
,考虑用1次泄露heap_base
,为后续堆链构造做准备;一次泄露libc
,可以通过free一个自己构造出来的、有fd指针指向的大堆块,再show之即可泄露指针。
再来看delete
,填满tcache,7次delete;double free
一个堆块,使之分别进入tcache
和fastbin
,2次delete;1个unsorted bin
泄露libc,1次delete。正好10次。
思路就来了。
还有先前版本触发setcontext+61
的magic gadget
到2.37也改了,这里选取了这一段:
|
|
再到沙盒,没有execve,没有write,限制了read的fd。
了解到机器出网,考虑socket传vps。至于connect参数中的host可以使用如下代码生成:
|
|
后来了解到这部分可以手算。
总长度16byte。
- 前2byte固定为
p16(2)
- 3-4byte为端口号,先hex之,换一下前后2byte,最后p16。比如
51337
,hex之后为0xc889
,payload里面写为p16(0x89c8)
- 6-8byte为ipv4地址每段的hex,从后往前拼起来然后p32,如
143.198.194.139
对应p32(0x8bc2c68f)
- 后8byte固定为
p64(0)
exp:
|
|
Manager
由于尾指针的存在导致的UAF。
前半段可以按照writeup的步骤泄露,后半段最终利用发现__libc_atexit
在2.31-0 9.9
中不可写,遂转向ld
中的_rtld_global
。
发现刚好可以满足r15
和r12
的条件。
|
|
largeheap (鸽了)
UAF+堆风水 开摆 且官方wp并未给出完整exp
可能的wp:here