(Midnight Sun CTF 2023) – Mt.Random

요즘은 해킹 분야보다 블록체인 자체에 관심이 많아 CTF와 Crypto 공부를 잠시 쉬었다. . 제 자신이 한심하고 또 열심히 해야겠다는 생각이 들어 지금까지 올린 글들을 모두 지우고 다시 초심을 찾으려 합니다. 힘내세요..!!

코드 분석

암호화 문제와 달리 PHP로 작성된 웹 페이지를 제공했습니다. 먼저 HTML 소스를 살펴보겠습니다.

(문제는 압축해서 comibear.kr에 있는 그대로 만들었는데 직접 해보고 싶으신 분들은 문제 사이트직접 가서 해결해보자 > < )

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mt. Random</title>
</head>
<body>
    <h1>Hiking Guide</h1>
    <p>This mountain is boring, I'm going to sample alot of seeds!</p>
    <a href="http://blog.comibear.kr/m/?generate_samples=1">Get a new sample</a>
</body>
</html>

우선, HTML 코드에는 많은 것이 없는 것 같습니다. 함수 하나를 살펴보면 Get a new sample이라는 링크를 클릭하면 generate_samples가 매개변수로 1로 설정됩니다. 샘플을 생성하는 함수가 무엇인지 알아보기 위해 PHP 코드를 살펴보겠습니다.

<?php
session_start();

$flag = "midnight{***redacted***}";

function flag_to_numbers($flag) {
    $numbers = ();
    foreach (str_split($flag) as $char) {
        $numbers() = ord($char);
    }
    return $numbers;
}

function non_continuous_sample($min, $max, $gap_start, $gap_end) {
    $rand_num = mt_rand($min, $max - ($gap_end - $gap_start));
    if ($rand_num >= $gap_start) {
        $rand_num += ($gap_end - $gap_start);
    }
    return $rand_num;
}

if(!str_starts_with($flag, "midnight{")){
    echo "Come back later.\n";
    exit();
}

$flag_numbers = flag_to_numbers($flag);

if (isset($_GET('generate_samples'))) {
    header('Content-Type: application/json');

    // Maybe we can recover these constants
    $min = 0;
    $max = 0;
    $gap_start = 0;
    $gap_end = 0;
    $seed = mt_rand(0, 10000); // Varying seed
    $samples = ();

    foreach ($flag_numbers as $number) {
        mt_srand($seed + $number);
        $samples() = non_continuous_sample($min, $max, $gap_start, $gap_end);
    }

    echo json_encode(("samples" => $samples));
    exit();
}
?>

별로 어려운 것 같지도 않고,