(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(); } ?>

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