[Dreamhack 드림핵] Type c-j WriteUp

2024. 2. 1. 15:00Hacking/WebHacking Wargame Writeup

문제 링크

https://dreamhack.io/wargame/challenges/960

 

Type c-j

Description php로 작성된 페이지입니다. 알맞은 Id과 Password를 입력하여 플래그를 획득하세요. 플래그의 형식은 DH{...} 입니다.

dreamhack.io

 

문제

 

풀이

첫 화면이 이렇게 펼쳐지는데 일단 막막하므로 코드를 먼저 살펴본다.

 function getRandStr($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
    
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[mt_rand(0, $charactersLength - 1)];
        }
        return $randomString;

이 부분에 대한 코드 해석을 우선적으로 진행해야한다.

getRandStr() 함수는 숫자, 영문을 조합해서 랜덤 출력하는 함수이다.

여기서는 인수에 $length = 10이 들어가 있으므로 랜덤 값을 10번 가져와서 randomString이라는 변수에 저장할 것으로 보인다. 

    $id = getRandStr();
    $pw = sha1("1");

id에 getRandstr()에서 생성한 랜덤한 아이디를 저장하고 pw에는 sha1()함수에 1을 넣어 암호화한 값을 넣는 것이다. 

sha1() 함수는 단방향 암호의 종류이다.

아무튼 그런데, 

if((int)$input_id == $id && strlen($input_id) === 10){
        echo '<h4>ID pass.</h4><br>';
        if((int)$input_pw == $pw && strlen($input_pw) === 8){
            echo "<pre>FLAG\n";
            echo $flag;
            echo "</pre>";
          }
        } else{
          echo '<h4>Try again.</h4><br>';
        }
      }else {
      echo '<h3>Fail...</h3>';
     }

아이디는 길이가 10과 같아야 하고 패스워드는 길이가 8과 같아야한다는 조건이 있다. 

이걸 해결하면 FLAG를 획득할 수 있다고 나와있다. 

sha1(1)을 해시 생성기에 돌리면 

356A192B7913B04C54574D18C28D46E6395428AB

여기서 8자리만 잘라서 비밀번호를 생성하고, (356a192b)

아이디는 문자열을 int형으로 전환하라고 하는데, 이때 앞에 숫자가 없으므로 0으로 10자리를 채우면 되니까,

 

플래그를 얻을 수 있다.