护网杯 pwn writeup
mergeheap
漏洞利用
libc2.27,strcat连接的时候溢出改size造成overlapping,之后tcache dup改chunk的size,拿到unsorted bin泄露地址,最后tcache dup到free_hook即可。
1 | int Merge() |
exp.py
1 | #coding=utf-8 |
flower
漏洞利用
只能Add0x58
及以下的chunk,Add的时候不会检查index位置是否为空可以直接覆写,input有off-by-one,但只有0x58的可以。
1 | __int64 Add() |
1 | __int64 __fastcall get_input(_BYTE *a1, unsigned int a2) |
这里输入choice时使用scanf,因为scanf是用malloc分配的缓冲区,在输入数据量大的时候会进行chunk的合并操作,合并之后的chunk会被放入smallbin,分配的时候会先看smallbin,不合适用top_chunk分配。
泄露libc:释放几个chunk,scanf输入大量数据最后merge得到unsorted bin,分配一个chunk用Show即可泄露Libc。
get shell:开始先用chunk shrink,改了size之后发现smallbin报的size error,之后以为这个构造有问题,于是改成了chunk extend,结果merge的时候好像不会合并或者出问题(总之是自己操作不太行)。最后还是改回chunk shrink,构造后面的fake_prev_size和fake_size,最后构造拿到Overlap chunk制造double free,地址开随机化的话heap前一个字节为0x55或0x56,0x56对应fastbin[0x50],free一个0x28的块,在main_arena里malloc到这个块0x56打头为size的块,修改main_arena的top_chunk到malloc_hook附近的块,这里选的是0x25,malloc到这个块修改realloc_hook为one_gadget,malloc_hook为realloc+x,偏移和gadget自己调整一下,最后拿shell。
exp.py
1 | #coding=utf-8 |
silentheap
前言
这题花的时间最久,最后也不算完全搞好,看了长亭的Exp和另一个大佬的思路,留在这里记录一下。
程序逻辑
程序有几个功能,Malloc1分配一个0x158的块,在0x154偏移处放了magic1函数地址
1 | void Malloc1() |
Malloc2分配一个0x358的堆块,0x354处放magic2函数地址
1 | void Malloc2() |
Free函数从后往前覆盖,不会清空chunk_addr[idx],但是会把chunk_size[idx]清零。
1 | int Free() |
CallFunc可以去调用堆里的magic函数,这里有UAF,UAF一个0x358的块,提前在里面构造好magic2的函数地址,之后可以任意地址执行。长亭的wp是ret到了0x08048690,调试之后发现ret过去相当于getinput栈地址,size为0x08..的一个极大数,这就造成了栈溢出,因为这里没有puts函数,栈迁移之后构造ret2_dl_runtime_resolve应该就可以了,但是调试发现不太行,这块有点迷,也懒得编译32位libc去看源码了,再看另一个师傅1mpossible的wp发现可以爆破,bss里放个binsh,之后爆破execv的地址,大概中间三字节是0xdxx或者0xexx,因此复杂度应该是256*2,本地跑了三分钟出的,个人感觉远程应该要10分钟以上。
1 | from pwn import * |
1 | int CallFunc() |
1 | .text:08048690 lea eax, [ebp+nptr] |
exp.py
1 | from pwn import * |