i春秋网络内生安全实验场圣诞赛
前言
复习无聊,间隙做了这个小比赛的几个题,pwn整体难度不高,很友好。
heap
漏洞利用
看雪CTFQ3的原题,有off-by-one。libc为2.23。malloc_hook自己加了一个hook函数,所以改hook没用,这里ub攻击IO_list_all,用0x60的small bin伪造文件结构体get shell。(看群里有WM的师傅可能出题人是同一个)
exp.py
1 | #coding=utf-8 |
Internal_Chat_System
漏洞利用
看这个register和login开始还以为是xctf final的原题,后来发现还是有点不同,UpdateProfile里有个off-by-one,AddDelete里有个UAF。泄露libc卡了我很久,最后Add自己为friend再删除自己,再View就可以将main_arena+88的内容作为name输出,泄露堆地址。
1 | ssize_t __fastcall UpdateProfile(int idx) |
Unlink之后在bss上构造node->heap(具体而言就是构造一个node,它的name_chunk是一个堆地址,且这个堆地址是一个未释放的node地址(0x130大小的块),我们按照这个伪造的node信息登上去(username为一个堆地址(就是那个0x130块作为node用的name_chunk地址))),之后Add一个Friend,就是这个0x130的块,也就是我们构造的假的结构体们如下:
fake_node:bss_addr->fake_usr_name_addr(some_node_addr)->some_node_addr’s user_name_addr。
一旦我们删除这个friend,即删除这个0x130的块,我们的fake_usr_name_addr的内容就是main_arena+88,View即可得到。
getshell方法就很多了,我这里是改aoti@got到system,输入菜单的时候输入”/bin/sh\x00”即可。
exp.py
1 | #coding=utf-8 |
Self-service Refueling System
exp.py
这个题基本没什么好说的,普通栈溢出,先leak libc之后get shell。
1 | #coding=utf-8 |