<?php
include('config.php'); // flag here!!
$string = urldecode($_GET['foo']);
if ($string == 'admin') die('out1');
else $string = 'admin';
if ($string != 'admin') die('out2');
if ('admin' != 'admin') die('out3');
else $string = urldecode($_GET['foo']);
if ($_GET['bar']) $string = $string.'/'.substr($_GET['bar'], 0, 31);
$hash = '0e747318923710937801923789017319'; // hashing twice
if ($_GET['foo']) $account = explode('/', $string);
if (isset($account) && strlen($account[1]) != 32) die('out4');
if ((!$_GET['bar'] || !isset($_GET['bar'])) && $_GET['foo']) die('out5');
if (md5($account[1]) == $hash) die($flag);
show_source(__FILE__);
?>
상당히 많은 시간을 로직 분석에 쏟았다.
결론은
foo에는 admin이외의 어떠한 값이 들어가도 되며 bar에는 1이라는 최소한의 값만 들어가도 된다는 것
$account라는 변수는 무조건 설정 되어 있어야 하며 설정 될려면 foo에 파라미터를 넘겨야 함.
explode('/',$string);는 $string에 있는 값에서 /를 기준으로 배열로 나눔
if (isset($account) && strlen($account[1]) != 32) die('out4');
이 부분에서 길이 32개를 만족시켜주어야 한다.
즉
foo=admin/sVfMpo5axzo6wJAdOL9yYCbodHVn3rxv&bar=111
위와 같은 쿼리로 해당 로직을 모두 만족 시킬 수 있다.
문제는 md5 해슁시 0e를 뽑아내는 32자리의 문자열을 구해야 하는데 이것을 구하느라 컴퓨터가 터질 뻔 했다 ㄸㄷ..
32자리 랜덤 문자열 구하는 코드