요즘은 해킹 분야보다 블록체인 자체에 관심이 많아 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();
}
?>
별로 어려운 것 같지도 않고,