吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1538|回复: 20
收起左侧

[CTF] 2026 新春快乐破解活动之番外题

  [复制链接]
ZhangYixiSuccee 发表于 2026-3-22 22:12

1、查壳

首先惯例查壳,发现lua语言,那么可以直接解压得到lua脚本
image-20260322210759402.png

2、lua解密

脚本语言如下,还发现asserts下面有flag数据,

image-20260322210831937.png

image-20260322210914889.png

seg000:00000000                 db  53h ; S
seg000:00000001                 db 5Eh, 11h, 8
seg000:00000004                 dd 45575C11h, 0F061A5Dh, 55736h, 8223046h, 2F4B4515h, 3A1E0F21h
seg000:0000001C                 dd 1D11576Ch, 425B364Bh
seg000:00000024                 db  0Eh
seg000:00000025                 db 0Dh

main.lua里面有脚本语言,

local function getWinMessage()
    local content = nil

    if love.filesystem.getInfo("assets/flag.dat") then
        content = love.filesystem.read("assets/flag.dat")
    end

    if not content or currentDifficulty ~= "hard" then
        return "You WIN!"
    end

    local key = "52pojie"
    local keyLen = #key
    local result = {}
    local bit = require("bit")

    for i = 1, #content do
        local b = string.byte(content, i)
        local k = string.byte(key, ((i - 1) % keyLen) + 1)
        table.insert(result, string.char(bit.bxor(b, k)))
    end

    return table.concat(result)
end

然后观察逻辑,可以看到,key = "52pojie",然后将data数据和key按个异或,可以得到key,

#include <stdio.h>
#include <string.h>

int main() {
    // 密文数据(从汇编代码中提取)
    unsigned char ciphertext[] = {
        0x53, 0x5E, 0x11, 0x08, 0x11, 0x5C, 0x57, 0x45,
        0x5D, 0x1A, 0x06, 0x0F, 0x36, 0x57, 0x05, 0x00,
        0x46, 0x30, 0x22, 0x08, 0x15, 0x45, 0x4B, 0x2F,
        0x21, 0x0F, 0x1E, 0x3A, 0x6C, 0x57, 0x11, 0x1D,
        0x4B, 0x36, 0x5B, 0x42, 0x0E, 0x0D
    };

    int len = sizeof(ciphertext);
    char key[] = "52pojie";
    int keyLen = strlen(key);

    printf("密文长度: %d 字节\n", len);
    printf("解密密钥: %s\n\n", key);

    printf("解密过程:\n");
    printf("索引\t密文(hex)\t密钥(char)\tXOR结果(char)\n");
    printf("------------------------------------------------\n");

    unsigned char plaintext[len + 1];

    for (int i = 0; i < len; i++) {
        int keyIndex = i % keyLen;
        unsigned char decrypted = ciphertext[i] ^ key[keyIndex];
        plaintext[i] = decrypted;

        printf("%d\t0x%02X\t\t%c (0x%02X)\t%c (0x%02X)\n", 
               i, ciphertext[i], 
               key[keyIndex], key[keyIndex],
               decrypted >= 32 && decrypted <= 126 ? decrypted : '.', 
               decrypted);
    }

    plaintext[len] = '\0';

    printf("\n================================================\n");
    printf("解密结果: %s\n", plaintext);
    printf("================================================\n");

    return 0;
}

image-20260322211416588.png

结果如下:flag{52pojie_2026_Happy_NewYear!>w<}

免费评分

参与人数 5威望 +1 吾爱币 +23 热心值 +5 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
shenhua545 + 1 + 1 热心回复!路过学习!!!!
雙魚座 + 1 + 1 用心讨论,共获提升!
a1392378750 + 1 + 1 我很赞同!
JesseJay666 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JesseJay666 发表于 2026-3-22 23:38
本帖最后由 JesseJay666 于 2026-3-22 23:39 编辑

学习了。关键点在于识别出LuaJIT的壳,然后找到 main.lua 里的 bit.bxor 异或逻辑。用您提供的C代码或者自己用Python重写一遍,都能成功解密。感谢分享详细过程!
recipeck 发表于 2026-3-22 22:21
GULUGAGA 发表于 2026-3-23 01:02
d199212 发表于 2026-3-23 08:22
膜拜大佬,当时完全没有思路
zjb65 发表于 2026-3-23 08:32
继续学习,谢谢分享。
clive185 发表于 2026-3-23 09:06
暂时没用上,应该很不错
ssisal 发表于 2026-3-23 09:20
虽然没看懂,但努力能看懂中。。
lxxyh 发表于 2026-3-23 09:54
可以的,支持支持
cuiwangliu 发表于 2026-3-23 09:55
我说我没看懂你们不会介意吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-5-9 08:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表