OverTheWire: Natas level8
OverTheWire 문제풀이 - Natas
* Bandit는 웹 보안 관련 문제입니다.
* 개인적인 문제풀이로 해답을 보시기 전에 직접 풀어보시기를 권해드립니다.
* 반드시 연습용으로 제공된 환경에서만 작업하시기 바랍니다. 악용으로 일어난 사태는 절대로 책임지지 않습니다.
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 |