OverTheWire: Natas level8

반응형


OverTheWire 문제풀이 - Natas

* Bandit는 웹 보안 관련 문제입니다.

* 개인적인 문제풀이로 해답을 보시기 전에 직접 풀어보시기를 권해드립니다.

* 반드시 연습용으로 제공된 환경에서만 작업하시기 바랍니다. 악용으로 일어난 사태는 절대로 책임지지 않습니다.

[링크] Natas 바로가기


Natas level8

Natas8에 접속하면 다음과 같은 화면이 뜬다. input 창이 뜨면서 값을 입력하라고 한다. 임의의 값을 입력하면 Wrong이라는 문자를 출력해준다.


[소스 분석]

소스보기를 통해 해당 페이지의 index-source.html 소스를 살펴볼 수 있다. 소스는 다음과 같다.

<?


$encodedSecret = "3d3d516343746d4d6d6c315669563362";


function encodeSecret($secret) {

    return bin2hex(strrev(base64_encode($secret)));

}


if(array_key_exists("submit", $_POST)) {

    if(encodeSecret($_POST['secret']) == $encodedSecret) {

    print "Access granted. The password for natas9 is <censored>";

    } else {

    print "Wrong secret";

    }

}

?>


<form method=post>

Input secret: <input name=secret><br>

<input type=submit name=submit>

</form>

input으로 post 값으로 secret 변수를 넘기는데 해석하자면 encodeSecret(secret) 값이 $encodedSecret = "3d3d516343746d4d6d6c315669563362"와 같을 때 natas9 패스워드를 프린트 해준다고 한다. secret 값을 찾아야 하는데 그 전에 encodeSecret함수를 분석해볼 필요가 있다. 함수 내용은 다음과 같다.

bin2hex(strrev(base64_encode($secret)))

  • bin2hex : 바이너리 데이터를 16진 표현(hex)으로 변환

  • strrev:문자열 뒤집기

  • base64_encode:주어진 data를 base64로 인코드

encodeSecret함수는 위와 같이 secret 값을 3단계로 걸쳐서 반환한다. 그것에 대한 결과 값은 $encodedSecret로 미리 제시해 주었으므로 이를 역으로 올라가면 원래의 secret 값을 구할 수 있을 것이다. 따라서 코드는 다음과 같이 짰다. 

  • pack("H*", string) : hex를 바이너리 데이터로 변환

  • strrev : 문자열 뒤집기

  • base64_decode : base64로 인코드된 data를 디코드

이것에 대한 결과는 다음과 같다.

이 값이 맞는지 검증해보려면 나온 값으로 다시 반대로 적용시켜 보면 된다.

그러면 다음과 같이 코드와 동일한 값이 나온다.


얻은 secret 값을 input에 넣어 보내면 인증이 성공하며 다음 레벨의 패스워드를 얻을 수 있다.

next level password : W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

반응형

'War Game > natas' 카테고리의 다른 글

OverTheWire: Natas level10  (0) 2017.07.12
OverTheWire: Natas level9  (0) 2017.04.27
OverTheWire: Natas level7  (0) 2017.04.24
OverTheWire: Natas level6  (0) 2017.04.20
OverTheWire: Natas level5  (0) 2017.04.20
TAGS.

Comments