6번 문제를 클릭하면 계정 정보, index.phps 링크가 존재한다. 또한, 문제를 해결하기 위해 base64 인코딩 및 디코딩 힌트가 주어진다.
'index.phps' 링크를 클릭해 소스코드를 보면 base64 인코딩 및 디코딩으로 분류된다.
최초 페이지 접근 시 쿠키 값이 설정되어 있지 않으므로 'guest' 계정을 총 20회 base64 인코딩한다. 이후 인코딩 된 값에서 숫자를 특수 문자로 치환해 최종 쿠키 값으로 설정한다.
문제를 해결하기 위한 단서는 디코딩 부분에 있다. 디코딩된 'user', 'password' 쿠키 값이 'admin'이면 문제를 해결할 수 있다.
<?php
if(!$_COOKIE[user])
{
$val_id="guest";
$val_pw="123qwe";
for($i=0;$i<20;$i++)
{
$val_id=base64_encode($val_id);
$val_pw=base64_encode($val_pw);
}
$val_id=str_replace("1","!",$val_id);
$val_id=str_replace("2","@",$val_id);
$val_id=str_replace("3","$",$val_id);
$val_id=str_replace("4","^",$val_id);
$val_id=str_replace("5","&",$val_id);
$val_id=str_replace("6","*",$val_id);
$val_id=str_replace("7","(",$val_id);
$val_id=str_replace("8",")",$val_id);
$val_pw=str_replace("1","!",$val_pw);
$val_pw=str_replace("2","@",$val_pw);
$val_pw=str_replace("3","$",$val_pw);
$val_pw=str_replace("4","^",$val_pw);
$val_pw=str_replace("5","&",$val_pw);
$val_pw=str_replace("6","*",$val_pw);
$val_pw=str_replace("7","(",$val_pw);
$val_pw=str_replace("8",")",$val_pw);
Setcookie("user",$val_id);
Setcookie("password",$val_pw);
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?
$decode_id=$_COOKIE[user];
$decode_pw=$_COOKIE[password];
$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id);
$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw);
for($i=0;$i<20;$i++)
{
$decode_id=base64_decode($decode_id);
$decode_pw=base64_decode($decode_pw);
}
echo("<font style=background:silver;color:black> HINT : base64 </font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");
if($decode_id=="admin" && $decode_pw=="admin")
{
@solve(6,100);
}
?>
</body>
</html>
소스코드에서 확인한 대로 최초 접근 시 쿠키 값이 설정되어 있지 않으므로 'guest', '123qwe'를 base64 인코딩하여 쿠키 값으로 설정됐다.
아이디와 패스워드가 동일하므로 'admin' 문자열을 총 20회 base64 인코딩 및 숫자를 치환하는 파이썬 스크립트를 작성한다.
# admin_base64.py
# by daze
import base64
val_id="admin"
for i in range(0,20):
val_id = base64.b64encode(val_id)
val_id.replace("1","!")
val_id.replace("2","@")
val_id.replace("3","$")
val_id.replace("4","^")
val_id.replace("5","&")
val_id.replace("6","*")
val_id.replace("7","(")
val_id.replace("8",")")
print val_id
파이썬 스크립트를 실행하면 base64 인코딩 된 문자열이 생성된다.
인코딩 된 문자열을 'user', 'password' 쿠키 값으로 설정하면 6번 문제 클리어한다.