Wargame/AOVER

AOVER 핵발사 시스템(Web) 풀이

먼즈 2019. 8. 5. 21:54

높은 배점 치고 풀이는 간단합니다 ^&^

일단 스크립트를 줬고, 키 입력란을 줬으니 문제 풀이 순서는 대충

1. 스크립트 해석

2. 알맞은 풀이법 생각

3. 키 입력, 플래그 짠

정도가 되겠네요

그럼 스크립트를 한번 해석해보겠습니다 마수리 앙

<?php
    if(isset($_POST["Key1"]) && isset($_POST["Key2"]) && isset($_POST["Key3"])){
        if(hash('md5',$_POST["Key1"]) == hash('crc32',$_POST["Key2"])){
            if(hash('crc32',$_POST["Key2"]) == hash("md4", $_POST["Key3"])){
                if(hash("md5", $_POST["Key1"]) == hash("md4", $_POST["Key3"])){
                    echo "<script>alert('[Suzukaze aoba says]\\nThanks a lot! I launched an nuclear to some space!\\n\\nHere\'s a little prize!\\n[FLAG HERE]');</script>"; 
                }else{ echo "3"; Fail(); }
            }else{ echo "2"; Fail(); }
        }else{echo "1";  Fail(); }
    }
    function Fail(){ echo "<script>alert('[Suzukaze aoba]\\nT.T... I want to fire nuclear...');</script>"; }
?>

md4, 5 나오고 crc32는 생소하지만 해시 관련한 문제일 거 같죠

Key1을 md5로 해시한 값 == Key2를 crc32로 해시한 값 == Key3을 md4로 해시한 값

>true 이면 플래그를 띄울 거 같습니다

 

에이 뭐야 무차별 대입하면 되겠네 ㅎㅎ 네 개소리입니다

 

여기선 매직해시라는 걸 사용해야 되는데, 매직 해시라는 거는 PHP에서 값에 대한 최적의 자료형을 찾아주기 위해 탑재된 편의기능인 PHP Type juggling에 의해 발생됩니다.

 

조금 더 설명을 하자면,

방금 말한 PHP는 변수를 정의하는 데에 있어서 타입 선언을 제대로 요구하지 않습니다. 다만 그 변수가 사용되는 상황에 맞게 타입을 결정할 뿐이죠

그런데 0e로 시작, 뒤에가 모두 숫자인 문자열은 PHP에서 float 타입으로 인식합니다.

즉 0e1234과 0e4321을 모두 string 타입으로 지정을 해도 PHP에서는 float 타입, 0으로 인식한다는 뜻입니다

 

도와줘서 고마워요 설명충! 자 그럼 매직해시가 잘 정리돼있는 사이트를 찾아봤습니다

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

 

Magic Hashes | WhiteHat Security

For more than the last decade, PHP programmers have been wrestling with the equals-equals (==) operator. It’s caused a lot of issues. This has a particular implication for password hashes. Password hashes in PHP are base16 encoded and can come in the form

www.whitehatsec.com

여기 들가셔서 스크롤 쭉쭉 내리다보면 매직해시가 해시함수별로 잘 정리돼있는 표를 볼 수 있습니다.

여기서 md5, crc32, md4에서 "Magic" number / string에 해당하는 값을 각각 Key1, Key2, Key3에 복붙하면 플래그가 뜨는 것을 확인할 수 있습니다 ^^7