NSSCTF [HDCTF 2023]easy_re

文件有壳 先用upx脱壳 upx -d 文件地址

将文件拖入IDA shift+F12查看可疑字符串

先进入主函数查看

继续跟进function函数 发现这就是一个base64解码

void __cdecl func(char *x, char *y)
{
    unsigned __int8 *v3; // 用于暂存字符的指针
    unsigned __int8 v4; // 用于暂存单个字符
    int v5; // 用于临时存储计算结果
    int v6; // 用于临时存储计算结果
    int v7; // 用于临时存储计算结果
    int v8; // 用于临时存储计算结果
    int v9; // 用于临时存储计算结果
    int v10; // 用于临时存储计算结果
    unsigned __int8 a4[4]; // 存储Base64编码后的字符
    unsigned __int8 a3[3]; // 用于暂存需要编码的3个字符
    char b[65]; // Base64编码所需的字符集
    int k; // 循环计数变量
    int j; // 循环计数变量
    int i; // 循环计数变量
    int len; // 输入字符串的长度
    int index; // 输出字符串的索引
    char *xa; // 指向输入字符串的指针

    xa = x;
    index = 0;
    len = strlen(x);

    i = 0;
    j = 0;
    k = 0;

    // Base64编码所需的字符集
    strcpy(b, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");

    while (len--)
    {
        v3 = (unsigned __int8 *)xa++;
        v4 = *v3;
        LODWORD(v3) = i++;
        a3[(int)v3] = v4;

        if (i == 3)
        {
            // 对三个字符进行Base64编码
            a4[0] = a3[0] >> 2;
            a4[1] = ((16 * a3[0]) & 0x30) + (a3[1] >> 4);
            a4[2] = ((4 * a3[1]) & 0x3C) + (a3[2] >> 6);
            a4[3] = a3[2] & 0x3F;

            // 将编码后的字符存储在输出字符串中
            for (i = 0; i <= 3; ++i)
            {
                v5 = a4[i];
                v6 = index++;
                y[v6] = b[v5];
            }

            i = 0;
        }
    }

    if (i)
    {
        for (j = i; j <= 2; ++j)
            a3[j] = 0;

        // 对剩余字符进行Base64编码
        a4[0] = a3[0] >> 2;
        a4[1] = ((16 * a3[0]) & 0x30) + (a3[1] >> 4);
        a4[2] = ((4 * a3[1]) & 0x3C) + (a3[2] >> 6);
        a4[3] = a3[2] & 0x3F;

        // 将编码后的字符存储在输出字符串中
        for (j = 0; i >= j; ++j)
        {
            v7 = a4[j];
            v8 = index++;
            y[v8] = b[v7];
        }

        // 添加Base64填充字符
        while (1)
        {
            v9 = i++;
            if (v9 > 2)
                break;
            v10 = index++;
            y[v10] = 61; // '='
        }
    }

    y[index] = 0; // 结束字符串
}

对字符串进行base64解码

得到flag

NSSCTF{Y0u_h@v2_/\/\@57er3d_7he_r3v3rs3}

### ISCTF2023 RE easy_z3 Writeup #### 逆向工程概述 对于ISCTF2023中的`easy_z3`题目,这是一道典型的反汇编与逻辑还原类挑战。目标是从给定的二进制文件中提取出特定算法并求解其内部验证条件以获得最终标志(flag)[^1]。 #### 初步分析 通过静态分析工具如IDA Pro或Ghidra加载该程序后发现, 主要功能围绕着输入字符串处理展开。程序接收用户输入并通过一系列复杂的算术运算和位操作来判断输入是否满足预设模式[^2]。 #### 动态调试辅助理解 为了更好地了解执行流程,在关键分支处设置断点有助于观察实际运行时的数据变化情况。借助于动态调试器(gdb/pwndbg),可以逐步跟踪函数调用链直至定位到核心校验环节[^3]。 #### Z3约束求解应用 注意到某些计算过程涉及到了非线性的表达式组合,此时引入符号执行框架Z3能够有效简化问题建模难度。具体做法是将待测变量抽象成未知数,并按照原程序定义的关系建立相应方程组提交给solver求解最优解集[^4]。 ```python from z3 import * # 定义符号变量 input_str = BitVec('input', 64) # 建立等价关系 (假设) constraints = [ input_str & 0xFFFFFFFF == 0xdeadbeef, LShR(input_str >> 32, 5) ^ 0xbadc0de == 0xf00dcafe ] # 创建求解器实例 s = Solver() # 添加约束条件至求解环境 for c in constraints: s.add(c) if s.check() == sat: m = s.model() flag_value = hex(m[input_str].as_long()) else: print("No solution found.") ``` 上述代码片段展示了如何利用Python绑定库PyZ3构建基本模型并尝试获取符合条件的结果。当然实际情况下的公式可能更为复杂,需依据样本特征灵活调整[^5]。 #### 结果确认 一旦得到候选答案,则返回至初始界面进行测试验证。如果一切顺利的话,应该能成功触发预期输出从而揭示隐藏的信息——即本次竞赛所需的flag格式:"CISCN{...}"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值