이전에 풀었던 xcz.kr 21번처럼 php가 엄청나게 난독화되어있다.
xcz.kr 21번을 풀면서 난독화에 대해서 조금 익숙해져서 이번에는 일일히 복호화하는데 시간이 좀 덜
걸렸다. 요령을 적자면
1. 주석처리된 부분을 지운다.
2. 함수 하나에 한줄이 차지하게 정렬한다.
3. 최대한 많은 범위를 한번에 치환한다. 자잘한것은 놔두고, 한번 치환 후 눈치를 봐서 치환하던지,
그냥 놔두던지 한다.
3번같은경우 주석을 지우면
$_717=base64_decode(base64_decode(base64_decode(base64_decode(base64_encode('V1cxR2VscFVXVEJZTWxKc1dUSTVhMXBSUFQwPQ==')))));;;;;;;;;;;;;;;;;
같은 $717변수는 딱 보면 base64를 복호화 여러번 한다. 이걸 그냥 직접 하기보다는
또다른 php페이지를 만들어서 echo $_717; 처럼 해주면 한번에 된다.
또 $_u[1]=$_616(false,'$_=_a();${"'.str_rot13('p3Ivp3El').'"} = $_("c3Vic3Ry");return "${c3Vic3Ry}";');;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
요런 이상한거는 나중에 복호화해보면 람다함수와 비슷한건데, 눈치를 봐서 쓰이는 곳에서 잘
치환해주면 된다. 복호화된 코드.
<?php session_start(); $_SERVER = $_SERVER; $_SERVER2 = $_SERVER; $_SERVER3 = $_SERVER2; $_GET=$_GET; $_u=array(); $_u[0]=create_function(false,'return base64_decode("'.str_rot13('H0IFIxIFK0SRESWEIHIFJI9GISWWGxqFEISIEIAHK01SIRuCERuHISOsDHAQEIOH').'");'); $_u[1]=create_function(false,'${"'.str_rot13('p3Ivp3El').'"} = base64_decode("c3Vic3Ry");return "${c3Vic3Ry}";'); $_u[2]=create_function('$_','return base64_decode($_);'); $_㎣㎣㎣? = preg_split('/(?!\\##\$\$\$uu)=/',$_SERVER[QUERY_STRING]); if( LEVENSHTEIN(urldecode($_㎣㎣㎣?[0]),$_GET[urldecode($_㎣㎣㎣?[0])])==0 ) { validate_result($_GET[urldecode($_㎣㎣㎣?[0])]); } function validate_result($result){ if($result === 'phpinfo();'){ $_SESSION["solved_advanced_2"] = true; header("Location:./"); } } echo "Good luck. <a href='./'>Back to the challenges main page.<br/><i>Please note that you will only get feedback if you solved this challenge. Wrong attempts do not generate any output at all.
"; highlight_file('code.php'); ?>
가 되는데 여기서 코드 해석을 잘 해보면. 이상한 $_㎣㎣㎣?요 변수에 $_SERVER[QUERY_STRING]
을 대상으로 preg_split으로 첫번째 정규표현식에 나온대로 코드를 나누게되는데,
$_SERVER[QUERY_STRING]를 찾아보면 get방식으로 전송한 데이터라고 한다.
그리고 정규표현식에 의해 나눠진 배열에서 LEVENSHTEIN함수로 첫번째 배열과 $_GET배열의 첫번째
값을 비교한다. (LEVENSHTEIN함수는 인자가 두개일시 strcmp와 같은 기능을 하는것 같다.)
그리고 같을경우 $_GET의 첫번째 인자를 validate_result함수로 보내는데, 이 함수의 인자로 들어가는
값이 phpinfo();이면 통과이다. 결국 get방식으로 답을 보내는데, 이게 preg_split으로 나눠질때
동일하게 나눠지면 된다(LEVENSHTEIN부분). GET방식으로 ?phpinfo();=phpinfo();
요렇게 보내주면 잘 나눠져서 모든 조건에 맞음을 알 수 있다.
'webhacking > etc' 카테고리의 다른 글
WeChall Training: WWW-Robots, Training: WWW-Basics, Limited Access (0) | 2015.01.05 |
---|---|
Security Override Decryption 1~7 (0) | 2014.12.21 |
Security Override Advanced 1 (0) | 2014.12.19 |
Security Override Basic (0) | 2014.12.17 |
Security Override Recon (0) | 2014.12.17 |