요즘은 해킹 분야보다 블록체인 자체에 관심이 많아 한동안 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();
}
?>
어렵지 않은 것 같다