🦙

Writeup for Impossible Puzzle

に公開

問題

Daily AlpacaHack 2026/04/10 Impossible Puzzleという問題です.

試したこと

URLにアクセスしてみると次のページが表示されました.

AとBを入力して,その入力2つが等しく,長さが異なるならばFLAGを取得できそうです.
次に,配布されたファイルのindex.phpを確認しました.

index.php
index.php
<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $A = $_POST['A'] ?? '';
    $B = $_POST['B'] ?? '';

    // type check
    if (!is_string($A) || !is_string($B)) {
        die('Invalid input');
    }
    // check
    if (strlen($A) != strlen($B) && $A == $B){
        echo "<blockquote>Congratulations! Here is your flag:\n" . getenv('FLAG') . "</blockquote>";
    }
    else {
        echo "<blockquote>Try again!</blockquote>";
    }
}

?>

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>Impossible Puzzle</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://unpkg.com/sakura.css/css/sakura.css" type="text/css" />
    <script src="https://cdn.jsdelivr.net/npm/dompurify@3.3.1/dist/purify.min.js"></script>
</head>

<body>
    <h1>Impossible Puzzle</h1>
    <p>Enter two strings A and B. If they are equal in content but different in length, you will get the flag!</p>
    <form method="post">
        <label for="A">A:</label>
        <input type="text" id="A" name="A" required>
        <label for="B">B:</label>
        <input type="text" id="B" name="B" required>
        <button type="submit">Submit</button>
    </form>
</body>
</html>
index.php
if (strlen($A) != strlen($B) && $A == $B){

この部分で入力を判定しています.
phpは,== と === の比較演算子があります.
== は,比較する2つの値のデータ型が異なる場合,同じ型に自動変換してから値を比較します.
=== は,値だけでなく,データ型も完全に一致しているかを比較します.型の自動変換は一切行われません.
今回は, == のほうが使われているため,1と1.0,1と01など入力してあげると両方とも数値の 1 として扱われるため,1 == 1 で True になります.

FLAG

Alpaca{L00se_c0mpar1sons_1n_php_mak3s_unexp3cted_behavi0r}

その他

ほかにも,0e123と0e0456などの入力があります.これは,Magic Hashesと呼ばれる手法らしいです.0e の後に数字が続く文字列は,PHPでは0 × 10の〇乗という指数表記の数値として解釈されます.0に何を掛けても0です.
これは,問題と全く関係ないのですが,通常のinputよりも爆速なinputがあることを最近知りました.

import sys
input = sys.stdin.readline

Discussion