Pwnhub 2023 三月 Pwn 专场
这下我也是有Pornwnhub账号的人了(
Pwnhub 2023-Mar 月赛 Pwn WriteUp
赛时就出了一个,看了WP直接拍大腿。
sh_v1.1
第一眼看上去就是一堆意义不明的运算,还基本相同,而且看起来对程序正常运行没啥影响。
所以先nop之,然后基本代码逻辑就能看出来了。
可以看出来程序实现了一个基于类shell的笔记本。
漏洞点在ln
和rm
处,删除时并未检测文件是否有链接并全部删除之,链接文件元数据中的指针没有清空,造成UAF
。
没给libc,就要锁定版本了。
先随便申请两个堆块,删除之,UAF,看看堆块的指针值。
可以看到有2a0
字样且为6
字节整,版本2.26~2.31
。
再double free
试一下,有报错,版本2.29~2.31
。
然后就是基本操作了,uaf
改tcahce
的fd
指针达到任意地址写,unsorted bin
泄露libc,打freehook
。
找libc比较费事,用unsorted bin
泄露的地址算出malloc hook
,再丢进如libc.rip
这种网站查一波就能查出来几个版本然后挨个试就行了。
|
|
three_edit
只能申请0x50-0x70
之间大小的堆块,堆块列表在堆上,edit
没有对idx下界做检查。
没有show
,那就考虑unsorted bin
打stdout leak
了。原理从略。
至于ubin的来源,既然都能控制堆块列表了,那构造指向伪造的堆块的指针,就是基本操作了。
爆破stdout第4个bytes,$\frac{1}{16}$的成功率。
剩下的就是常规操作了。
|
|
ttsc
一个骚东西,scanf("%d")
如果单纯输入一个负号即-
,这个输入不会有内存的写入操作,但会认为已经输入完成。
即:
|
|
对于这道题,在init部分中输入的两个数字对应的内存位置正好有一个IO相关指针,使用前面提到的方法,可以不覆盖这个指针,进而通过它来泄露libc地址。
然后就没啥了(
|
|
tototo
给了各10次的malloc和calloc,edit限制从ptr+9起,delete有UAF,只清零了自建的inuse数组。
两种方法。
一种是官方WP的。
- tcache stach unlink 打 mp_.tcache_bins 让更大的堆块进入tcache
- 用这里提到的第二条利用链,先利用UAF申请到malloc_hook附近的大堆块,然后__malloc_hook改setcontext+61/53,stdin全扬了,stdin->_IO_write_ptr改指向构造好的ucontext_t结构体的指针,stdin->vtable改_IO_str_jumps->_IO_str_overflow。
- 然后触发exit,触发exit->fcloseall->_IO_clean_up->_IO_flush_all_lockp->_IO_str_overflow->malloc->setcontext这条调用链,最后shellcode还是rop就任君选择了。
|
|
另一种是群友的。泄露_environ
打栈。
嗯,牛逼。
|
|