首页
社区
课程
招聘
[原创]KCTF2025 第七题 危局初现 题解 (一血属于LLM)
发表于: 2025-8-30 03:15 2044

[原创]KCTF2025 第七题 危局初现 题解 (一血属于LLM)

2025-8-30 03:15
2044

简单审查程序结构十分简单,替换 get_number_from_string 为实际的数字之后喂给 GPT 求解:

中途提供了 QNX 系统中 /etc/rc.d 存在的信息,之后就全交给 LLM 做了
(最近发现如果要求LLM分析自己的输出,比如包含复杂度之类的信息,LLM往往可以给出质量更高的代码,本次对话也如是)

671K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3q4@1k6%4m8@1i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2M7X3g2Q4x3V1j5$3z5r3q4X3z5r3b7^5x3g2)9J5k6r3t1J5y4U0S2Q4x3X3b7^5x3o6p5I4i4K6u0V1z5r3u0X3k6W2)9J5k6o6R3&6x3U0l9#2j5U0u0S2x3X3f1@1j5R3`.`.

直接跑 LLM 写出的程序就可以得到全部 470 组解:

// solve_fixed.c  —  适用于你的情况:/etc/rc.d 存在;两种 devctl 位都尝试
#include <stdio.h>
 
static const char *hexd = "0123456789abcdef";
 
static void try_bit(int bit) {
    // 从等式 v51 == v24 - 34 可得:8*d1 - d10 = 58 - bit
    int d1_candidates[2], d10_candidates[2], np = 0;
    for (int d1 = 0; d1 < 16; ++d1) {
        int d10 = 8*d1 - (58 - bit);
        if (0 <= d10 && d10 < 16) {
            d1_candidates[np] = d1;
            d10_candidates[np] = d10;
            if (++np == 2) break;
        }
    }
    if (np == 0) {
        printf("[bit=%d] 无解(8*d1 - d10 = %d 在 0..15 范围内不可达)。\n", bit, 58 - bit);
        return;
    }
 
    // 行和约束(每行 = 34):
    // R0: d1 + d3 + d4 = 34
    // R1: d2 + d4 + d7 = 34
    // R2: d3 + d5 + d9 = 34
    // R3: d5 + d8 + d10 = 34
    // R4: d6 + d7 + d8 = 34
    // 变量:d1..d10(其中 d1,d10 由上式给出)
 
    long found = 0;
    for (int p = 0; p < np; ++p) {
        int d1 = d1_candidates[p];
        int d10 = d10_candidates[p];
 
        // 选自由变量的一个合理顺序 + 逐步推导其余变量,并做范围剪枝
        for (int d3 = 0; d3 < 16; ++d3) {
            int d4 = 34 - d1 - d3;                      // R0
            if ((unsigned)d4 > 15u) continue;
 
            for (int d6 = 0; d6 < 16; ++d6) {
                for (int d7 = 0; d7 < 16; ++d7) {
                    int d8 = 34 - d6 - d7;              // R4
                    if ((unsigned)d8 > 15u) continue;
 
                    int d5 = 34 - d8 - d10;             // R3
                    if ((unsigned)d5 > 15u) continue;
 
                    int d2 = 34 - d4 - d7;              // R1
                    if ((unsigned)d2 > 15u) continue;
 
                    int d9 = 34 - d3 - d5;              // R2
                    if ((unsigned)d9 > 15u) continue;
 
                    // 所有 d 都在 0..15,则得到一个完整解
                    char key[32];
                    key[0]=hexd[d1]; key[1]=hexd[d2]; key[2]=hexd[d3]; key[3]=hexd[d4]; key[4]=hexd[d5];
                    key[5]=hexd[d6]; key[6]=hexd[d7]; key[7]=hexd[d8]; key[8]=hexd[d9]; key[9]=hexd[d10];
                    key[10]='a'; key[11]='s'; key[12]='a'; key[13]='s'; key[14]=0;
 
                    // 额外:长度 ≤ 14 且末尾 "asas"(已满足)
                    printf("[bit=%d] %s\n", bit, key);
                    ++found;
                }
            }
        }
    }
    if (!found) {
        printf("[bit=%d] 遍历完候选也没解。\n", bit);
    } else {
        printf("[bit=%d] 共找到 %ld 把 key。\n", bit, found);
    }
}
 
int main(void){
    try_bit(0);       // /etc/rc.d 存在时,这个分支通常有解
    try_bit(0x80);    // 多跑一遍以防你的系统该位为 1(多数情况下这里会无解)
    return 0;
}
// solve_fixed.c  —  适用于你的情况:/etc/rc.d 存在;两种 devctl 位都尝试
#include <stdio.h>
 
static const char *hexd = "0123456789abcdef";
 
static void try_bit(int bit) {
    // 从等式 v51 == v24 - 34 可得:8*d1 - d10 = 58 - bit
    int d1_candidates[2], d10_candidates[2], np = 0;
    for (int d1 = 0; d1 < 16; ++d1) {
        int d10 = 8*d1 - (58 - bit);
        if (0 <= d10 && d10 < 16) {
            d1_candidates[np] = d1;
            d10_candidates[np] = d10;
            if (++np == 2) break;
        }
    }
    if (np == 0) {
        printf("[bit=%d] 无解(8*d1 - d10 = %d 在 0..15 范围内不可达)。\n", bit, 58 - bit);
        return;
    }
 
    // 行和约束(每行 = 34):
    // R0: d1 + d3 + d4 = 34
    // R1: d2 + d4 + d7 = 34
    // R2: d3 + d5 + d9 = 34
    // R3: d5 + d8 + d10 = 34
    // R4: d6 + d7 + d8 = 34
    // 变量:d1..d10(其中 d1,d10 由上式给出)
 
    long found = 0;
    for (int p = 0; p < np; ++p) {
        int d1 = d1_candidates[p];
        int d10 = d10_candidates[p];
 
        // 选自由变量的一个合理顺序 + 逐步推导其余变量,并做范围剪枝
        for (int d3 = 0; d3 < 16; ++d3) {
            int d4 = 34 - d1 - d3;                      // R0

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 85
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
链接404了,能补一补,看一下吗
2025-10-3 13:31
0
游客
登录 | 注册 方可回帖
返回