본문 바로가기
CTF/INCOGNITO 2021

[INCOGNITO CTF] Do you know Hashes

by L3m0n S0ju 2021. 8. 27.


 

<?php
   $keys = [
      NULL,
      "",
      "",
      ""
   ];

   if(hash('md5', $keys[1]) == hash('crc32', $keys[2])){
      if(hash('crc32', $keys[2]) == hash('md4', $keys[3])){
         if(hash('md5', $keys[1]) == hash('md4', $keys[3])){
            echo "<script>alert('[Verified Success]\\nCongrats! {flag}');</script>";
         }else fail();
      }else fail();
   }else fail();

   function fail() {
     echo "<script>alert('Failed to verify!');</script>";
   }
?>

 

 

문제 서버에 접속하면 위와 같이 key 값을 채워넣어서 조건문을 모두 우회해야한다. 조건은 md5, crc32, md4 알고리즘으로 해시값을 만들어서 비교한 결과가 같아야합니다. md5는 결과가 32바이트이고 crc32는 결과가 8바이트이기 때문에 길이부터 다르므로 문자열 비교로는 같을 수가 없습니다. 따라서 정수를 비교하는 방식으로 가야합니다. 예를 들어 php에서 0='0'은 true 입니다. 문자열과 정수형을 비교를 하면 문자열에 숫자만 있는 경우 문자열을 정수로 변환한 후 비교를 하기 때문에 0='0'이 true가 됩니다.

 

 

 

 

 


https://www.whitehatsec.com/blog/magic-hashes/

여기서 사용할 수 있는 개념이 Magic Hash 입니다. Magic Hash란 해시 값이 0e로 시작하는 문자열을 말합니다. 위 사이트로 접속하면 해시 값들의 Magic Hash와 Magic Number/String을 찾을 수 있는데 예를 들어 md5를 240610708 값으로 해시 변환을 하면 0e462097431906509019562988736854 값으로 변환되는데 앞에 0e는 정수형에서는 0^46209743 과 같이 0의 46209743 제곱을 의미합니다. 따라서 정수로는 0을 나타내게 되므로 위 모든 조건을 우회할 수 있습니다.

 

 

 

 

 


버프스위트로 패킷을 잡아서 key 값을 넣어준 뒤 진행하면 플래그를 획득할 수 있습니다.

 

 

 

 

 


플래그

'CTF > INCOGNITO 2021' 카테고리의 다른 글

[INCOGNITO CTF] 코로나 바이러스 대응 긴급조회  (0) 2021.08.28
[INCOGNITO CTF] Calculator  (0) 2021.08.28
[INCOGNITO CTF] inco_hack.png  (0) 2021.08.28
[INCOGNITO CTF] Deconstructionism  (0) 2021.08.28
[INCOGNITO CTF] hex carving  (0) 2021.08.27

댓글