hackctf Guess me 문제 풀이
Guess me 문제에 들어가보면은
php 소스코드가 나오는것을 볼 수 있다.
만약에 php 를 자주사용해봤다면 바로 알겠지만 혹시 모른다면은
file_get_contents 와 extract 함수를 알고있다면 충분히 풀이가 가능하다.
extract 함수는
www.php.net/manual/en/function.extract.php
PHP: extract - Manual
[New Version]This function is very useful for filtering complicated array structure.Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.Code: $_GET, INPUT_POST => $_POST, INPUT_COOKIE => $_COOKIE
www.php.net
안에 들어가는 배열의 키 와 값을 변수로 만들어준다고 보면은 된다.
<?php
$arr = array(
"key"=>"helloworld"
);
extract($arr);
echo $key;
?>
이런섹으로 "key" 이라는 이름에 helloworld라는 값이 있는 배열을
extract($arr); 이렇게 해버리면
$key 라는 변수가 생성되면서 helloworld라는 값이 들어가게 된다.
그러면은 이제 다시 소스코드로 가보면
if (isset($guess)) {
$secretcode = trim(file_get_contents($filename));
if ($guess === $secretcode) {
$flag = file_get_contents('flag.txt');
echo "<p>flag is"." $flag</p>";
$guess 라는 변수가 없는데 $guess 변수를 체크하고
$guess 변수와 file_get_contents 함수로 불러온 $secretcode 변수와 비교하는것을 볼 수 있다.
그러면 extract 함수를 이용해서
$_GET 변수에 키과 값을 전달해야되는데
PHP 같은 경우
$_GET 변수는
url?hello=world
이런식으로 전달이 가능하다.
그리고 $secretcode 변수를 조작하기 위해서는
$filename 을 조작해야된다.
왜냐하면 ?secretcode= 이런식으로 한다고해도 또 변수가 선언되기때문에 의미가 없다.
하지만 file_get_contents 라는 함수에서 $filename 이라는 변수를 받아 해당 파일을 불러오는데
만약에 없는 파일이면은 아무런 값이 반환되지 않아서 $filename 을 조작하면 $secretcode 라는 변수에는 아무런 값이 안들어가게 되는것이다.
그러면 이제
$guess 변수와 $secretcode 변수랑 똑같이 되기 위해서는
ctf.j0n9hyun.xyz:2030/?guess=&filename=
이런식으로 아무런 값을 넣지 않으면 FLAG 가 출력된다.
이 문제는 PHP 만 알고있으면 충분히 풀리는 문제이다. ͡~ ͜ʖ ͡°
FLAG is HackCTF{3xtr4c7_0v3rr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}