开始钓鱼。。。
Veryeasy
程序分析
Delete
函数free
掉堆块后,没有将堆指针清空,存在一个 UAF
漏洞。然后delete
执行时的限制,必须 note_num
大于free_num
,作用不大,因为note_num
被转为了 unsigned int
。
利用分析
这样的题,做了很多遍,2.27
下有一个 UAF
漏洞,没有输出函数。好像前几天的字节CTF
也遇到类似的,但是我总感觉做的有点慢,调试那个 tcache_perthread_struct
布局花了太多时间。
思路都是,劫持tcache next
指针到 tcache_perthread_struct
。然后释放到unsortedbin
,再修改到 stdout
来泄露地址。最后 free_hook
一把梭得到shell
。
TIPS:为了将 tcache_perthread_struct
放到 Unsortedbin
中,我之前选择的方法是修改 tcache_perthread_struct
的位置为7,再释放tcache_perthread_struct
。但这样做主要是计算这个结构体比较麻烦。这次还学到一种方法,在 2.27
下对tcache
的 double free
是没检测。如果通过 double_free
构造了三个堆块,再连续分配3次,此时这个 tcache count
就为-1
。系统也会认为超过了7次。
EXP
1 | from pwn import * |
unknown
程序分析
初始IDA
分析的时候,可以看到应该是加了啥混淆的。这里学到一种从内存提取原ELF
的方法:
在 Pwndbg
里运行如下两个命令,将内存dump
下来(内存dump
之前只在windbg
里用过):
1 | pwndbg> dump binary memory ./dump 0x555555554000 0x555555556000 |
然后将dump
的内存,执行如下脚本,组成一个ELF
文件,即可正常分析:
1 | # encoding=utf-8 |
很模板的菜单题,但是我又花了很久才找到洞。感觉这种菜单题,能够留洞的地方也就那么几个。是不是我自己尝试出一个菜单题的题,会不会对这些留洞的地方更敏感一点。
如图所示,可以看到对 Id
没有检查上边界,导致存在上溢。
利用分析
chunk_list
的上边就是 chunk_size_list
,如果我们输入id
为负数,那么就可以将分配的堆块指针写入 chunk_size_list
,这样就可以更改 chunk
的size
。
这里唯一需要注意的是,在分配堆块时,会检查当前 chunk_list[id]
处是否为空,如果不为空,则分配失败。
如果我们先分配了chunk_list[0]
,再想通过在 chunk_list[-16]
向 chunk_size_list[0]
的位置分配一个堆指针,此时会失败。因为此时 chunk_size_list[0]
处是 chunk[0]
的size
,不为空。
这个限制也很简单,当输入的size
为0时,malloc
会默认分配 0x20
的堆块。这样 chunk_size_list[0]
也为空,可以成功分配堆块到此处。
然后就是很正常的泄露地址,劫持 tcache next
指针到 free_hook
来getshell
。
EXP
1 | from pwn import * |
fsplayground
这道题,学到了关于 Linux
下的文件相关的知识:
/proc 目录
Linux
系统内核提供了一种通过 /proc
文件系统,在程序运行时访问内核数据,改变内核设置的机制。 /proc
是一种伪文件结构,也就是说是仅存在于内存中,不存在于外存中的。 /proc
中一般比较重要的目录是 sys
、net
和 scsi
,sys
目录是可写的,可以通过它来访问和修改内核的参数
/proc
中还有一些以 PID
命名(进程号)的进程目录,可以读取对应进程的信息,另外还有一个 /self
目录,用于记录本进程的信息。
/proc/self目录
可以通过 /proc/$PID/
目录来获得该进程的信息,但是这个方法需要知道进程的PID
是多少,在 fork、daemon
等情况下,PID
可能还会发生变化。所以 Linux
提供了 self
目录,来解决这个问题,不过不同的进程来访问这个目录获得的信息是不同的,内容等价于 /proc/
本进程 PID
目录下的内容。所以可以通过 self
目录直接获得自身的信息,不需要知道 PID
。
/proc/self/maps
这个文件用于记录当前进程的内存映射关系,通过读取该文件可以获得内存代码段基地址
/proc/self/mem
该文件记录的是进程的内存信息,通过修改该文件相当于直接修改进程的内存。这个文件可读可写,需要结合 maps
的映射信息来确定读的偏移值,无法读取未被映射的区域,只有读取的偏移值是被映射的区域才能正确读取出内容。
程序分析
实现了一个文件系统,可以对文件打开,并读写,和修改文件偏移指针。
利用分析
/proc/self/mem
中记录一个进程的内存信息,我们可以先输出其所有的内存映射关系,这个有点类似 vmmap
的形式,在其中找到 libc
基址。然后再在 /proc/self/mem
中找到 free_hook
的地址,将其值修改为 system
的地址。也就完成了 free_hook
来 getshell
很重要的一步。后续即可正常 getshell
了。
EXP
1 | from pwn import * |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/10/15/2020钓鱼城杯/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!