webhacking/etc

Security Override Advanced 2

qkqhxla1 2014. 12. 21. 13:55



이전에 풀었던 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