LOADING

加载过慢请开启缓存 浏览器默认开启

2025miniLCTF_Re Writeup

x96re

逻辑如下

"""
buf4  = buf0 ^ f(buf1 ^ buf2 ^buf3 ) ^ key4
..
buf35 = buf31 ^ f(buf32 ^ buf33 ^ buf34) ^ key35

dec:
buf31 = buf35 ^ f(buf32 ^ buf33 ^ buf34) ^ key35

bufn = buf[n+4] ^ f(buf[n+1] ^ buf[n+2] ^ buf[n+3]) ^ key[n+4]
"""

key =[0x918188F3, 0x3BC35D39, 0xB1EE5F1, 0x935103FD, 0xAEEB97C8, 0x77084D36, 0xD6B5DE83, 0x37AA6640, 0x6A145898, 0x4F356F1D, 0xB5D86522, 0xBFD70CDE, 0x356703DC, 0xE7111E66, 0xB8C167DA, 0x386AE3F5, 0x81BEBDC1, 0xBAC0EE25, 0x1909DEA9, 0x9095E8B, 0x8611D4E8, 0xD0DCCCFD, 0xE3376831, 0x32A4957D, 0x28A321B9, 0xA76F24D1, 0x52827D19, 0xD5A0379B, 0x48092956, 0xA59D9548, 0x6D6B698D, 0x44853F0E, 0x22A8A3CE, 0xB0762BD6, 0x1DBAA385, 0x76E5D7D7]
TBL_BOX = [0xD6, 0x90, 0xE9, 0xFE, 0xCC, 0xE1, 0x3D, 0xB7, 0x16, 0xB6, 0x14, 0xC2, 0x28, 0xFB, 0x2C, 0x05, 0x2B, 0x67, 0x9A, 0x76, 0x2A, 0xBE, 0x04, 0xC3, 0xAA, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9C, 0x42, 0x50, 0xF4, 0x91, 0xEF, 0x98, 0x7A, 0x33, 0x54, 0x0B, 0x43, 0xED, 0xCF, 0xAC, 0x62, 0xE4, 0xB3, 0x1C, 0xA9, 0xC9, 0x08, 0xE8, 0x95, 0x80, 0xDF, 0x94, 0xFA, 0x75, 0x8F, 0x3F, 0xA6, 0x47, 0x07, 0xA7, 0xFC, 0xF3, 0x73, 0x17, 0xBA, 0x83, 0x59, 0x3C, 0x19, 0xE6, 0x85, 0x4F, 0xA8, 0x68, 0x6B, 0x81, 0xB2, 0x71, 0x64, 0xDA, 0x8B, 0xF8, 0xEB, 0x0F, 0x4B, 0x70, 0x56, 0x9D, 0x35, 0x1E, 0x24, 0x0E, 0x5E, 0x63, 0x58, 0xD1, 0xA2, 0x25, 0x22, 0x7C, 0x3B, 0x01, 0x21, 0x78, 0x87, 0xD4, 0x00, 0x46, 0x57, 0x9F, 0xD3, 0x27, 0x52, 0x4C, 0x36, 0x02, 0xE7, 0xA0, 0xC4, 0xC8, 0x9E, 0xEA, 0xBF, 0x8A, 0xD2, 0x40, 0xC7, 0x38, 0xB5, 0xA3, 0xF7, 0xF2, 0xCE, 0xF9, 0x61, 0x15, 0xA1, 0xE0, 0xAE, 0x5D, 0xA4, 0x9B, 0x34, 0x1A, 0x55, 0xAD, 0x93, 0x32, 0x30, 0xF5, 0x8C, 0xB1, 0xE3, 0x1D, 0xF6, 0xE2, 0x2E, 0x82, 0x66, 0xCA, 0x60, 0xC0, 0x29, 0x23, 0xAB, 0x0D, 0x53, 0x4E, 0x6F, 0xD5, 0xDB, 0x37, 0x45, 0xDE, 0xFD, 0x8E, 0x2F, 0x03, 0xFF, 0x6A, 0x72, 0x6D, 0x6C, 0x5B, 0x51, 0x8D, 0x1B, 0xAF, 0x92, 0xBB, 0xDD, 0xBC, 0x7F, 0x11, 0xD9, 0x5C, 0x41, 0x1F, 0x10, 0x5A, 0xD8, 0x0A, 0xC1, 0x31, 0x88, 0xA5, 0xCD, 0x7B, 0xBD, 0x2D, 0x74, 0xD0, 0x12, 0xB8, 0xE5, 0xB4, 0xB0, 0x89, 0x69, 0x97, 0x4A, 0x0C, 0x96, 0x77, 0x7E, 0x65, 0xB9, 0xF1, 0x09, 0xC5, 0x6E, 0xC6, 0x84, 0x18, 0xF0, 0x7D, 0xEC, 0x3A, 0xDC, 0x4D, 0x20, 0x79, 0xEE, 0x5F, 0x3E, 0xD7, 0xCB, 0x39, 0x48]
mm =[0xDCBEE7D4, 0x78FB2439, 0xC06E8000, 0xD3C34A2C, 0xF53837D5, 0xA9C8D88D, 0x20CBDAE5, 0x2551D478]

def _rol_32(data,shift):
    data = (data<<shift) | (data>>(32-shift))
    data &=0xffffffff
    return data


def dword2byte_big(data):
    res = []
    for i in range(4):
        res.append((data >> (8 * (3 - i))) & 0xff)
    return res

def bytes2dword_big(bytesdata):
    res = 0
    for i in range(4):
        res ^= (bytesdata[i] << (8 * (3 - i))) & 0xffffffff
    return res

def func_data(data):
    data = dword2byte_big(data)
    data1 =[]
    for i in data:
        data1.append(TBL_BOX[i])
    data = bytes2dword_big(data1)
    data1 = _rol_32(data,2)
    data3 = data1 ^ data
    data4 = _rol_32(data,10) ^ data3
    data5 = _rol_32(data,18) ^ data4
    data = data5 ^ _rol_32(data,24)
    return data

def dec(mm):
    result =[]
    for i in range(len(mm)//4):
        buf = [0]*32
        enc = mm[4*i:4*i+4:]
        enc.reverse()
        buf.extend(enc)
        for n in range(31,-1,-1):
            buf[n] = buf[n+4] ^ func_data(buf[n+1] ^ buf[n+2] ^ buf[n+3] ^ key[n+4])
        for k in range(4):
            result.extend(dword2byte_big(buf[k]))
    return result

def enc(data):
    res = []
    for k in range(len(data)//16):
        buf = [0]*4
        for i in range(4):
            buf[i] = bytes2dword_big(data[i * 4 + 16 * k:i * 4 + 4 + 16 * k:])
        buf.extend([0] * 32)
        for n in range(32):
            buf[n + 4] = buf[n] ^ func_data(buf[n + 1] ^ buf[n + 2] ^ buf[n + 3] ^ key[n + 4])
        res.extend(buf[32:36:][::-1])
    return res

def xor(data,value):
    res =[]
    for i in range(32):
        if i>= 30: res.append(data[i])
        else: res.append(data[i] ^value)
    return res
littmm =[]
for i in mm:
    littmm.append(int.from_bytes(i.to_bytes(4,"little")))

a =dec(littmm)
b = xor(a,0x4c)

flag = ""
for i in b:
    flag += chr(i)
print("miniLCTF{"+flag+"}")

0.s1gn1n

import base64

xorkey = [
    0x58, 0x69, 0x7B, 0x06, 0x1E, 0x38, 0x2C, 0x20, 0x04, 0x0F, 0x01, 0x07,
    0x31, 0x6B, 0x08, 0x0E, 0x7A, 0x0A, 0x72, 0x72, 0x26, 0x37, 0x6F, 0x49,
    0x21, 0x16, 0x11, 0x2F, 0x1A, 0x0D, 0x3C, 0x1F, 0x2B, 0x32, 0x1A, 0x34,
    0x37, 0x7F, 0x03, 0x44, 0x16, 0x0E, 0x01, 0x28, 0x1E, 0x68, 0x64, 0x23,
    0x17, 0x09, 0x3D, 0x64, 0x6A, 0x69, 0x63, 0x18, 0x18, 0x0A, 0x15, 0x70
]

base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
tableint = [i for i in map(ord,base64_chars)]


max_len = 60

def is_printable(bs):
    return all(32 <= b <= 126 for b in bs)

def dfs(i, data,  current_sum,len,target_sum):
    if i % 4 ==0 and i>0: #剪枝1,是否能被解码为可见字符
        try:
            b64 = ''.join(map(chr, data[:i]))
            decoded = base64.b64decode(b64, validate=True)
            if not is_printable(decoded):
                return
        except:
            return

    if current_sum > target_sum: return #剪枝2,当前和是否大于给定值
    if i == len : #长度符合要求
        if current_sum == target_sum: #总和是否符合要求
            # print(data)
            print("Found:", ''.join(map(chr, data[0:60:]))) #打印结果
            return
        else: return
    if data[i]== 0x3d:
        sum = data[i] ^ data[i - 1] ^ xorkey[i]
        dfs(i + 1, data, current_sum + sum, len, target_sum)
    else:
        for c in tableint:
            data[i] = c
            sum = data[i] ^ data[i - 1] ^ xorkey[i]
            dfs(i + 1, data, current_sum + sum, len, target_sum)

for j in range(35,61): #爆破的长度
    for i in tableint: #爆破每个字符
        for k in range(3):
            input_str = [0] * max_len
            input_str[0] = i
            if k >= 1:input_str[j - 1] = 0x3d #考虑有等于的情况
            if k ==2:input_str[j-2] =0x3d

            dfs(1, input_str, i, j, 28 + j)

realres = "X1JLRjFfbmlkZ197MG5GaV9pQGVycnRMfTNzM21ucmlDZ2VubkV2X1RJRXM=" #正确的那个结果
res = base64.b64decode(realres).decode()
reslen =len(res)
tables ="".join(chr(i) for i in range(48,48+reslen))

print(tables) #0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[

index =[i for i in range(reslen)]

t = dict()
for i,j in zip(tables,index): 
    t[i] =j

strr ="O?P7Q@R3SAT8UBV1WCX9YDZ4[E:F0G;H5I<J2K=L6M>N" #ida里打乱得出的顺序

tt =[t[i] for i in strr] #生成对应表

flaglist = [0]*reslen
for i in range(reslen):
    flaglist[tt[i]] = res[i] #按照对应表还原

flag ="".join(flaglist)

print(flag)

d1ffer3nce

xxtea加解密逻辑如下

#include<stdio.h>
#include<stdint.h>
#define DELTA 1298755177
void btea(uint32_t* v, int n, uint32_t const key[4])
{
    uint32_t y, z, sum, delta;
    unsigned p, rounds, e;
    delta = 1298755177;  //魔改1
    rounds = 6 + 2025 / n;	//魔改2
    sum = 0;
    z = v[n - 1];
    do
    {
        sum += delta;
        e = (sum >> 2) & 3;
        for (p = 0; p < n - 1; p++)    
        {
            y = v[p + 1];
            z = v[p] += (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z)));
        }
        y = v[0];
        z = v[n - 1] += (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p & 3)^ e] ^ z)));      
    } while (--rounds);

}
void dec_btea(uint32_t* v, int n, uint32_t const key[4])
{
    uint32_t y, z, sum, delta;
    unsigned p, rounds, e;
    delta = 1298755177;
    rounds = 6 + 2025 / n;
    sum = rounds * delta;
    y = v[0];
    do
    {
        e = (sum >> 2) & 3;
        for (p = n - 1; p > 0; p--)  
        {
            z = v[p - 1];
            y = v[p] -= (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p ^e) &3] ^ z)));
        }
        z = v[n - 1];
        y = v[0] -= (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p ^e) &3] ^ z)));   //这里的MX中传入的 p=0
        sum -= delta;
    } while (--rounds);
}


int main()
{
    uint32_t const k[4] = { 0x33323130, 0x37363534, 0x62613938, 0x66656463 };
    uint32_t mm[8] = { 0xbeae9d72,0x5b84e3a2,0xf1010f31,0xc203e7b3,0x9c0a814c,0x4d2ceda0,0x14a25292,0x21772d88 };
    int n = 8;

    dec_btea(mm, n, k);

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 4; j++)
            printf("%c", (mm[i]>> (8*j))&0xff);
    }

    return 0;

}