it 공부 일기 - 워게임 ctf 풀이 및 언어 강좌모음

webhacking 6번 문제 php 코드 해석 본문

wargame code 해석

webhacking 6번 문제 php 코드 해석

kimtong 2020. 7. 20. 17:07

webhacking.kr 의 6번 문제 php 코드를 보면

부분이

 

인코딩 시키는 부분과

 

 

디코딩 시키는 부분이있다.

이제 하나씩

해석을 해보자

include "../../config.php"

 

- include 함수를 이용해 ../../ 위치에있는 config.php 파일을 포함한다.

 

if($_GET['view_source']) view_source();

 

- 만약에 $_GET 배열중에 view_source 키값이 존재한다면 view_source() 라는 함수를 불러온다

 

if(!$_COOKIE['user']){

 

- 만약에 $_COOKIE(쿠키) 배열중에 user 이라는 쿠키가 존재하지 않으면

 

  $val_id="guest";

- $val_id 라는 이름으로 guest 문자열을 $val_id 변수에 저장


  
$val_pw="123qwe";

 

- $val_pw라는 이름으로 123qwe 문자열을 $val_pw 변수에 저장


  for(
$i=0;$i<20;$i++){

-for(초기식,조건식,증감식) 으로 이루어져있는 반복문을 이용하여 i 를 0 부터 20미만까지 1씩 증가하며 20번 반복


    
$val_id=base64_encode($val_id);

- $val_id 를 base64_encode 함수를 이용하여 인코딩을 시킨후에 $val_id 에 저장


    
$val_pw=base64_encode($val_pw);

- $val_pw 를 base64_encode 함수를 이용하여 인코딩을 시킨후에 $val_pw 에 저장


  }

 

 - $val_id 와 $val_pw 를 base64 인코딩을 for 반복문을 이용하여 20번 인코딩을 시킴


  
$val_id=str_replace("1","!",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 1 이라는 값을 ! 로 치환하여 저장

 

  $val_id=str_replace("2","@",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 2 이라는 값을 @ 로 치환하여 저장


  
$val_id=str_replace("3","$",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 3 이라는 값을 $ 로 치환하여 저장


  
$val_id=str_replace("4","^",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 4 이라는 값을 ^ 로 치환하여 저장


  
$val_id=str_replace("5","&",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 5 이라는 값을 & 로 치환하여 저장


  
$val_id=str_replace("6","*",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 6 이라는 값을 * 로 치환하여 저장


  
$val_id=str_replace("7","(",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 7 이라는 값을 ( 로 치환하여 저장


  
$val_id=str_replace("8",")",$val_id);

- $val_id 에 있는 값중 str_replace 함수를 이용하여 8 이라는 값을 ) 로 치환하여 저장

 


  
$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);

 

- 변수만 다를뿐이지 str_replace 함수를 이용하여 치환하는 패턴은 $val_id 와 동일

- $val_pw 를 str_replace 함수를 이용해 각 지정한 숫자들을 원하는 특수문자로 치환

 

  Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");

- Setcookie 함수를 이용해 user 쿠키를 생성한 후 $val_id 변수 안에있는 값을 user 값으로 하고 만료시간을 time()+86400 으로 지정하고 경로는 /challenge/web-06/ 으로 한다.

 

  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");

- Setcookie 함수를 이용해 password 쿠키를 생성한 후 $val_pw변수 안에있는 값을 password 값으로 하고 만료시간을 time()+86400 으로 지정하고 경로는 /challenge/web-06/ 으로 한다.


  echo(
"<meta http-equiv=refresh content=0>");

- 페이지 소스에 echo 이라는 함수를 이용해 <meta http-equiv=refresh content=0> 를 출력

 

  exit;

- 종료시킨다.
}

 

 

그리고 밑에있는 두번째 부분을 살펴보자

 

$decode_id=$_COOKIE['user'];

- $decode_id 변수명에 cookie 배열중 user 이라는 쿠키 값을 저장한다.

 

$decode_pw=$_COOKIE['password'];

 

- $decode_pw 에 cookir 배열중 password 이라는 쿠키값을 저장한다.

 

$decode_id=str_replace("!","1",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 ! 를 1 로 치환한다.


$decode_id=str_replace("@","2",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 @ 를 2 로 치환한다.


$decode_id=str_replace("$","3",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 $ 를 3 로 치환한다.


$decode_id=str_replace("^","4",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 ^ 를 4 로 치환한다.


$decode_id=str_replace("&","5",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 & 를 5 로 치환한다.


$decode_id=str_replace("*","6",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 *를 6 로 치환한다.


$decode_id=str_replace("(","7",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 ( 를 7 로 치환한다.


$decode_id=str_replace(")","8",$decode_id);

- $decode_id 에 str_replace 함수를 이용해 ) 를 8 로 치환한다.



$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);

 

위에있는 $decode_id 와 변수명만 다를뿐이지 패턴을 똑같다

- $decode_pw 이라는 변수에 str_replace 이라는 함수를 이용해 각 지정한 특수문자를 원하는 문자로 치환함

 

for($i=0;$i<20;$i++){

 

-for(초기식,조건식,증감식) 으로 이루어져있는 반복문을 이용하여 i 를 0 부터 20미만까지 1씩 증가하며 20번 반복

 

  $decode_id=base64_decode($decode_id);

 

-$decode_id 에 base64_decode 함수를 이용하여 base64디코딩을 시킨다.


  
$decode_pw=base64_decode($decode_pw);

 

-$decode_pw에 base64_decode 함수를 이용하여 base64디코딩을 시킨다.
}

 

- $decode_id 와 $decode_pw 를 base64_encode 함수로 디코딩을 for 로 인해 20번 반복 시킴

 

echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");

 

- echo 함수를 이용하여 웹 페이지에 <hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br> 를 출력

 

echo("ID : $decode_id<br>PW : $decode_pw<hr>");

 

- echo 함수를 이용하여 웹 페이지에 ID : $decode_id<br>PW : $decode_pw<hr> 를 출력

 

if($decode_id=="admin" && $decode_pw=="nimda"){
  
solve(6);
}

 

- 만약에 $decode_id 와 $decode_pw 가 admin , nimda 이라면 solve(6); 함수를 불러온다.

'wargame code 해석' 카테고리의 다른 글

webhacking 14번 문제 js 코드 해석  (0) 2021.01.11
webhacking 1번 문제 PHP 코드 해석  (0) 2020.07.20