-
<XCZ.KR> 21번 문제Wargame/XCZ.KR 2021. 11. 3. 12:23
제목이 PHP Obfuscation Crack이다.
말 그대로 PHP 난독화를 풀라는 뜻이다.
View source를 통해 소스 코드를 살펴보자.
코드를 분석하기 굉장히 어렵다.
PHP Obfuscation Decoder를 통해 풀어보겠다.
그래도 이해하기 굉장히 힘들다.
알아보기 쉽게 변수명을 알파벳 대문자로 바꿔본다.
먼저, h() 함수를 정의한다. $b에 전달받은 $a를 하나씩 아스키코드 숫자로 변환해서 붙이는 것을 확인할 수 있다.
'key'는 GET 방식으로 전송한다.
이 전송한 'key'는 '-'으로 분할하여 배열로 저장한다.
그리고 PHP에서 '@'는 오류 메시지를 표시하지 않겠다는 뜻이므로 코드 중간의 'Error'가 나타나는 반복문은 무시했다.
아래 조건문 4개가 등장한다.
우선 편리를 위해 n=숫자, c=숫자가 아님이라 표현하겠다.
첫 번째 조건부터 살펴보면
a[0][0]~a[0][1] = n, a[0][4] = c, 312 < h(a[0]) < 333, a[1][0] = c, a[1][3]~a[1][4] = n
위의 조건대로 하면 a[0]는 'nn??c'의 꼴을 띄게 된다. '??'는 처리하지 않기 때문에 마음대로 정하면 된다.
두 번째 조건을 살펴보면
300 < h(a[1]) < 326, a[2][0]=c, a[2][1]=n, 349 < h(a[2]) < 407
첫 번째 조건과 두 번째 조건을 성립하는 a[1]의 형태는 'c??nn'
세 번째 조건을 살펴보면
a[3][0]~a[3][1]=c, a[3][2]~a[3][4]=n, 357 < h(a[3]) < 359
위와 마찬가지 방법으로 하면 a[3] = 'ccnnn'
주의 깊게 봐야 할 부분은 h(a[3])의 값이 358이 되어야 한다는 부분이다.
네 번째 조건을 살펴보면
round(h(a[0]) + h(a[1]) + h(a[2]) + h(a[3])) / 4 == h(a[4])
4번째 조건이 걸리지만, 우선 첫 번째부터 차근차근 풀어보았다.
위 조건을 만족하게 첫 번째 문자열은 '00MMA'(48,48,77,77,65)로 h(a[0]) = 315
두 번째 문자열은 'AAA99'(65,65,65,57,57)로 h(a[1]) = 309
세 번째 문자열은 'z9AAA'(122,57,65,65,65)로 h(a[2]) = 374
네 번째 문자열은 'aa488'(97,97,52,56,56)로 h(a[3]) = 358
마지막 문자열은 'CCCCG'(67,67,67,67,71)로 h(a[4]) = 339로 네 번째 조건을 소수점 없이 딱 맞아떨어졌다.
앞에서 말했듯이 'key'는 GET 방식으로 전달한다.
또한, '-'로 분할한다고 했다.
따라서, 현재 URL 뒤에 '?key=00MMA-AAA99-z9AAA-aa488-CCCCG'를 추가하여 입력하면 인증 키 값을 획득할 수 있다.
이외에도 답이 될 수 있는 'key'값은 굉장히 많을 것 같다.
'Wargame > XCZ.KR' 카테고리의 다른 글
<XCZ.KR> 32번 문제 (0) 2021.11.07 <XCZ.KR> 18번 문제 (0) 2021.11.02