5번 문제를 클릭하면 로그인 기능을 수행하는 'Login' 버튼, 회원 가입을 할 수 있는 'Join' 버튼이 보인다.
회원 가입 버튼을 클릭하면 접근 거부 메시지가 나온다.
로그인 버튼을 클릭해 임의의 아이디와 비밀번호를 입력하면 아이디가 admin이 아닌 계정은 접근 거부라는 메시지가 나온다.
아이디는 'admin', 비밀번호는 임의의 값을 입력 후 로그인 버튼을 클릭하면 비밀번호가 다르다고 나온다.
메인 페이지의 소스코드를 확인해보면 로그인 버튼 클릭 시 'mem/login.php' 페이지로 이동되고, 회원 가입 버튼 클릭 시 접근 거부 메시지가 나온다.
소스코드에서 확인한 대로 'mem/' 경로로 이동하면 'Index of /hint' 타이틀이 보인다. 또한, 'mem/' 하위 경로에 'join.php', 'login.php' 페이지가 존재한다.
'join.php' 링크를 클릭하면 검은색 배경화면만 보이므로 소스코드를 확인한다. 소스코드를 보면 난독화되어 있다.
소스코드가 지저분하게 정렬이 되어 있으므로 온라인 포맷 코드로 정렬한다.
파이썬 스크립트로 난독화 된 코드를 해제하는 코드를 작성한다.
# join_deobfuscate.py
# by daze
l = 'a';
ll = 'b';
lll = 'c';
llll = 'd';
lllll = 'e';
llllll = 'f';
lllllll = 'g';
llllllll = 'h';
lllllllll = 'i';
llllllllll = 'j';
lllllllllll = 'k';
llllllllllll = 'l';
lllllllllllll = 'm';
llllllllllllll = 'n';
lllllllllllllll = 'o';
llllllllllllllll = 'p';
lllllllllllllllll = 'q';
llllllllllllllllll = 'r';
lllllllllllllllllll = 's';
llllllllllllllllllll = 't';
lllllllllllllllllllll = 'u';
llllllllllllllllllllll = 'v';
lllllllllllllllllllllll = 'w';
llllllllllllllllllllllll = 'x';
lllllllllllllllllllllllll = 'y';
llllllllllllllllllllllllll = 'z';
I = '1';
II = '2';
III = '3';
IIII = '4';
IIIII = '5';
IIIIII = '6';
IIIIIII = '7';
IIIIIIII = '8';
IIIIIIIII = '9';
IIIIIIIIII = '0';
li = '.';
ii = '<';
iii = '>';
lIllIllIllIllIllIllIllIllIllIl = lllllllllllllll + llllllllllll + llll + llllllllllllllllllllllllll + lllllllllllllll + lllllllllllll + ll + lllllllll + lllll;
lIIIIIIIIIIIIIIIIIIl = llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + lll + lllllllllllllll + lllllllllllllll + lllllllllll + lllllllll + lllll;
print ""
print "if (eval(%s).indexOf(%s) == -1) {" %(lIIIIIIIIIIIIIIIIIIl, lIllIllIllIllIllIllIllIllIllIl)
print " bye;"
print "}"
print ""
print "if (eval(%s).indexOf(%s) == -1) {" %(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L', lllllllllllll + lllllllllllllll + llll + lllll + '=' + I)
print " alert('access_denied');"
print " history.go(-1);"
print "} else {"
print " document.write('<font size=2 color=white>Join</font><p>');"
print " document.write('.<p>.<p>.<p>.<p>.<p>');"
print " document.write(<form method=post action=%s>);" %(llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll)
print "document.write(<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=%s maxlength=5></td></tr>);" %(lllllllll + llll)
print " document.write(<tr><td><font color=gray>pass</font></td><td><input type=text name=%s maxlength=10></td></tr>);" %(llllllllllllllll + lllllllllllllllllllllll)
print " document.write(<tr align=center><td colspan=2><input type=submit></td></tr></form></table>);"
print "}"
print ""
파이썬 스크립트를 실행하면 난독화 된 코드가 원본 코드로 변환됐다. 코드를 살펴보면 쿠키 값은 'oldzombie', URL은 'mode=1'이 존재해야 한다. 또한, 아이디와 비밀번호에 최대 문자 길이가 설정되어 있다.
5번 문제 메인 페이지에 'oldzombie' 쿠키 필드를 추가한다. 이후 'mem/join.php?mode=1' 페이지로 접속해보면 회원 가입 페이지가 보인다.
'admin' 계정으로 회원 가입을 시도하면 계정이 이미 존재한다는 메시지가 나온다.
아이디 입력 폼의 최대 글자 길이가 5이므로 적당히 늘려준 뒤 'admin '(스페이스바, %20)으로 회원 가입을 시도하면 정상적으로 회원 가입이 된다.
로그인 페이지로 이동하여 아이디는 'admin', 비밀번호는 회원 가입 시 입력한 비밀번호로 로그인을 하면 5번 문제 클리어한다.