前言

又是一个安洵杯!被师傅们狠狠带飞了,太强了!!

我负责的misc方向,来贴下题解qwq

杂项比较可惜的就是 cancellation 那题,搞到二维码了就是不会让图像更清晰点,不然A了 等官方wp来了学习一波。

sudoku_easy

交互题 nc端口要求根据给出的数独来写一个解决后的数独。

这题有一个bug就是level处这里只能输入数字,如果输入hard等字符串就会将多出的字符传到你的solve输入处,此时你怎么填写数独都是错误;题目问题 对输入参入的字符串不严谨。

使用Python解密数独即可,可以用Chatgpt生成解密代码:

剩下的就是用pwntools交互,循环发送的过程 最后interactive接收shell即可。

脚本

from pwn import *


def is_valid(board, row, col, num):
# 检查行是否合法
for i in range(9):
if board[row][i] == num:
return False

# 检查列是否合法
for i in range(9):
if board[i][col] == num:
return False

# 检查小九宫格是否合法
start_row = (row // 3) * 3
start_col = (col // 3) * 3
for i in range(3):
for j in range(3):
if board[start_row + i][start_col + j] == num:
return False

return True


def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0 # 回溯
return False # 所有数字都尝试过,没有找到合适的数字
return True


def print_sudoku(board):
a = ''
for row in range(9):
for col in range(9):
a += str(board[row][col])
a+='\n'
return a.strip()



context.log_level = 'debug'

p = remote('47.108.165.60',23479)

p.recv()

for i in range(7):
p.sendline('1')

p.recvuntil('Please select the level:')

p.sendline('5')

a = '---------------------\nnow give me you solve:'
content = p.recvuntil(a).decode().split(a)[0][-130:]

sudoku = content.split('---------------------')[1]

sudoku = sudoku.strip()
sudoku = sudoku.split('\n')
tmp = []
for sudo in sudoku:
a = [int(s) for s in sudo]
tmp.append(a)

if solve_sudoku(tmp):
result = print_sudoku(tmp)
log.info(result)
for line in result.split('\n'):
p.send(line)
#content = p.recv().decode()
p.interactive()

运行得到shell输入cat flag得到flag

FLAG

FLAG: SYCTF{easy_97d4bfa31985_5UD0KUkuKu}

烦人的压缩包

下载附件得到Zip压缩包

需要密码,尝试修复伪加密 无果。

爆破得到压缩包密码为 645321

解压后得到 hint.txt love.jpg

winhex分析 love.jpg 在尾部数据发现PK文件头,说明存在隐写

binwalk 分离图片,得到压缩包:

打开发现会报CRC32错误

尝试再次使用 binwalk 分离修复 PS:这里压缩包要binwalk修复一下再分离 不然出不了东西。

得到修复好的flag.txt,打开发现是Ook加密,最后解密得到FLAG

https://www.splitbrain.org/services/ook

FLAG

FLAG: SYC{Yxx_Say_Thank3Q_v3ry_much}

sudoku_speedrun

和上题数独库一样,不过这一道是要求在短时间内完成数独

是一个9x9的格子,wsad操控当前位置,要移到0处,输入数字即可填写数字,最后完成之后就可以得到FLAG

思路

数独解密和交互与第一个数独库题思路一样,不同的就是要多一步移动格子。

大体思路是采用遍历比较:

先将9x9数独库用正则匹配出来,然后再解密把正确的数独得出。

移动格子方面让正确的和原始的一行行遍历,同样的不管 不同的就根据当前是第x列添加对应的方向再补充对应的数字即可。

同时会记录在这一行走了多少格子,在到下一行的时候默认再添加上同样数量的反方向和s就到下一行了。

def payload(r1,r2):
# r1 wrong r2 right
payloads = ''
for a in range(9):
lines = ''
logs = 0
alls = 0
for b in range(9):
if r1[a][b] != r2[a][b]:
if b == 0:
lines += str(r2[a][b])
else:
log_number = (b-logs)*"d"
lines += log_number+str(r2[a][b])

alls += (b-logs)
logs = b
if a != 8:
lines += (alls)*"a" + 's'
payloads += lines
return payloads

由于输入的可以一行完成,那就直接把所有步骤加在一起最后传输过去即可。

脚本

from pwn import *


def is_valid(board, row, col, num):
# 检查行是否合法
for i in range(9):
if board[row][i] == num:
return False

# 检查列是否合法
for i in range(9):
if board[i][col] == num:
return False

# 检查小九宫格是否合法
start_row = (row // 3) * 3
start_col = (col // 3) * 3
for i in range(3):
for j in range(3):
if board[start_row + i][start_col + j] == num:
return False

return True


def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0 # 回溯
return False # 所有数字都尝试过,没有找到合适的数字
return True


def print_sudoku(board):
a = []
for row in range(9):
t = []
for col in range(9):
t.append(int(board[row][col]))
a.append(t)
return a


def payload(r1,r2):
# r1 wrong r2 right
payloads = ''
for a in range(9):
lines = ''
logs = 0
alls = 0
for b in range(9):
if r1[a][b] != r2[a][b]:
if b == 0:
lines += str(r2[a][b])
else:
log_number = (b-logs)*"d"
lines += log_number+str(r2[a][b])

alls += (b-logs)
logs = b
if a != 8:
lines += (alls)*"a" + 's'
payloads += lines
return payloads



def decode(tmp):
if solve_sudoku(tmp):
result = print_sudoku(tmp)
return result

import re

#context.log_level = 'debug'

p = remote('47.108.179.76',32892)

p.recvuntil('Please input')

p.sendline('1')

p.recvuntil('>')

p.sendline('7')

p.recvuntil(b'-------------------------')

content = p.recv()

log.info(content.decode())

data = content.replace(b'\x1b[1;32m',b'').replace(b'\r\n',b'').replace(b'\x1b[0m',b'').replace(b'\x1b[7;32m',b'').replace(b'-------------------------',b'')
sudoku = []

for line in data.split(b'| |'):
t = [int(s) for s in line.replace(b'|',b'').replace(b' ',b'').decode()]
sudoku.append(t)

r1 = str(sudoku)

result = decode(sudoku)

r1 = eval(r1)

show = ''
for a in result:
for b in a:
show+=str(b)
show+='\n'
log.info(show)

payloads = payload(r1,result)
log.info(payloads)

p.sendline(payloads)

while 1:
try:
content = p.recvline()
print(content)
except:
break
p.interactive()

FLAG

(靶机关闭了 贴下当时运行的flag)

容器Bug hhh: