(Midnight Sun CTF 2023) – 랜덤 힐

요즘은 해킹 분야보다 블록체인 자체에 관심이 많아 한동안 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 New Samples”라는 링크를 클릭했을 때 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(); } ?>

어렵지 않은 것 같다