house of spirit
house of spirit
这种利用方式主要是在栈上构造 fake chunk,从而更好的控制栈,修改返回地址。
利用条件:
- free(p) 中的 p 可控
- 可以泄漏栈地址
- 不可控区域前后都有区域可控(如图)
利用思路:
在栈中构造 fake chunk,大小覆盖掉函数的返回地址,再次分配得到返回地址控制,写入 one_gadget 或者 shellcode 地址。
注意如果构造 fastbin,free 函数会检测 next chunk 的大小与当前的 fake chunk 大小是否一致,需要绕过!
另外 fake fastbin chunk 的条件
- fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理。
- fake chunk 地址需要对齐, MALLOC_ALIGN_MASK
- fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐。
- fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于 av->system_mem 。
- fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况。
LCTF2016 pwn200
这个也是 BUU 上的一道经典例题
该题的栈有 RWX 权限,可以放 shellcode
存在 rbp 地址泄漏
v2 填满 shellcode 后地址
sub_400A29 存在栈溢出,只能溢出掉 free(p) 中的 p 参数
如图, buf 只有 58 字节,read 可以读入 64 字节,溢出 dest 变量。ptr 指针在后面的操作中会被当作 free 的参数
sub_400A29 调用之前的栈可控,构造 next chunk 的 size 域
解题思路
who are u? 传 shellcode 并填充满 42 字节泄漏 rbp
give me your id ~~? 传入 fake chunk 的大小,这里可以控制 fake chunk 的 next chunk 的 size 域。
give me money~ 传入 fake chunk,并修改 ptr 变量为 fake chunk 地址
先选 choice 1,free(ptr),将 fake chunk 插入到 fastbin
再选 choice 2,从 fastbin 从分配出栈内存,并修改地址为 shellcode 的地址
完整 exp
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!