当前位置:首页 > 技术 > 正文内容

GXYCTF2019 运气小伙子逆向解法与逻辑重构

访客 技术 2026年6月1日 1

环境评估与保护机制检测

针对该二进制样本,首要步骤是确认其是否存在加壳保护。通过加载专业的可执行文件检查工具进行分析,界面反馈如下:

PE 文件检测工具界面

分析结果表明,目标程序并未经过任何常见的压缩或混淆处理,处于原始状态。这意味着我们可以直接进行静态反汇编操作,而无需先进行脱壳处理。

函数定位与代码逻辑梳理

利用反编译利器 IDA Pro 载入样本,待自动分析流程结束后,借助全局字符串搜索功能(快捷键 Shift+F12)定位关键特征文本:

IDA 字符串搜索视图

搜索结果迅速锁定了核心输出语句。双击跳转至引用处,并通过交叉引用查找调用者(Shift+X),最终聚焦于名为 get_flag 的函数入口:

IDA 交叉引用分析视图

开启伪代码生成模式(F5),核心逻辑展示为一层循环结构,内部嵌套了基于随机数的分支跳转:

void* process_random_logic(void) {
    unsigned int time_seed;
    int loop_counter;
    int inner_index;
    char temp_buffer[0x28];
    
    // 初始化种子并设置随机数发生器
    time_seed = GetCurrentTime();
    SeedGenerator(time_seed);
    
    for (loop_counter = 0; loop_counter < 5; loop_counter++) {
        // 根据随机值决定执行路径
        switch (RandomNext() % 200) {
            // 分支 A:初始化部分密钥数据
            case 4:
                memcpy(temp_buffer, "\x7Ffo`guci", 8);
                break;
            
            // 分支 B:对数据进行位变换加密
            case 5:
                for (inner_index = 0; inner_index <= 7; inner_index++) {
                    if (inner_index % 2 != 0) {
                        temp_buffer[inner_index] -= 2;
                    } else {
                        temp_buffer[inner_index]--;
                    }
                }
                break;
                
            // 分支 C:拼接前缀并打印完整凭证
            case 1:
                Print("OK, it's flag:");
                ConcatString(flag_area, "GXY{do_not_", temp_buffer);
                PrintResult(flag_area);
                break;
                
            // 其他情况为干扰项或提示错误
            default:
                LogFailure("Unable to retrieve credential");
                break;
        }
    }
}

观察控制流可知,程序的正常运行依赖于特定的分支执行顺序。虽然外层是一个 5 次循环,但为了获取有效载荷,必须确保程序依次命中"初始化"、"加密变换"以及"输出结果"这三个关键状态。其中,小端序存储的数据在内存中的排列与实际读取顺序可能存在差异,需在还原过程中予以修正。

算法还原与脚本编写

基于上述分析,我们需要模拟特定分支的执行路径来还原被加密的字符串。考虑到内存布局的字节序影响,需先将获取到的密文段进行逆序处理,再根据索引奇偶性应用对应的偏移量解密。

以下为重构后的验证脚本:

def recover_secret_data(raw_input_str):
    """
    解密由 C 语言二进制文件中提取的乱码数据
    
    :param raw_input_str: 十六进制转义字符表示的密文
    :return: 解密后的明文片段
    """
    decrypted_chars = []
    
    # 处理小端序问题,反转字符串以匹配实际内存访问顺序
    processed_sequence = raw_input_str[::-1]
    
    # 遍历每个字节进行处理
    for idx, char_code in enumerate(processed_sequence):
        if idx >= 8:
            break
            
        current_value = ord(char_code)
        
        # 根据位置奇偶性应用不同减数
        shift_offset = 2 if (idx % 2 == 1) else 1
        
        restored_char = chr(current_value - shift_offset)
        decrypted_chars.append(restored_char)
        
    return "".join(decrypted_chars)

# 原始密文数据
payload = '\x7Ffo`guci'

# 执行恢复过程
hidden_part = recover_secret_data(payload)
print(f"Recovered segment: {hidden_part}")

运行脚本后,控制台将输出解密后的字符串片段:

Recovered segment: hate_me

目标凭证生成

结合固定的前缀信息,将解密得到的有效负载填入模板,即可构造出完整的通关凭证:

GXY{do_not_hate_me}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。