AOVER 핵발사 시스템(Web) 풀이
높은 배점 치고 풀이는 간단합니다 ^&^
일단 스크립트를 줬고, 키 입력란을 줬으니 문제 풀이 순서는 대충
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