Write-up

[SECCON 2017] Powerful_Shell writeup

ch4rli3kop 2018. 1. 14. 04:49
반응형

문제를 실행하면 다음과 같은 실행화면을 볼 수 있습니다. 

피아노 건반이 참 예쁘네요.


피아노 건반을 눌러보고 싶은 욕망대로 한 번 눌러 봅시다. 소리가 들리는 것을 보니 참 재밌습니다.
언젠가 이런 비프음을 이용해서 작곡을 해보고 싶은 마음이 듭니다.


아무튼 사용자의 입력을 받아 어쩌구 작동을 하므로 사용자의 입력이 플래그를 구하는데 있어서 꽤나 중요할 듯 싶습니다.
스크립트의 내용을 한 번 봅시다.

..........


정말 신박한 문제인 것 같습니다. 절로 일어나는 출제자에대한 존경심을 느끼며 세상이 넓음을 다시 한번 깨달아봅니다. 코드의 아래를 보니, 뭔가 스크립트를 추출하는 것을 알 수 있습니다. 위의 이러저러한 과정들을 통해 ECCON 이라는 변수에 어떤 스크립트를 만드는 것 같습니다. 

한 번 추출해봅시다.


적당히 수정해주어 파일을 추출해보니 다음과 같은 스크립트를 확인할 수 있습니다.



5~16 줄은 Host 를 체크하는 부분인 것 같습니다. 파워쉘 Get-EventLog 명령어를 이용해서 수집한 사용자의 로그온과 관련된 이벤트 로그가 1000개보다 적으면 종료되게 하는 것 같습니다. 하지만 사용자 로그온 이벤트는 하루정도만 있어도 1000개는 발생하니 왠만하면 통과할 것 같습니다. 어쨋든 문제푸는데에 필요없는 정보이니 지워버립시다.

25~82 줄은 피아노 건반을 화면에 표시해주는 부분입니다. 문제푸는데에 필요없는 정보이지만 미관상 놓아두겠습니다.


아무튼 적당히 스크립트를 살펴보았습니다. 꽤 중요한 것 같은 부분들을 살펴봅시다.


사실 적당히 스크롤을 돌리다가 탁 멈추는 곳은 이 곳일 것입니다. 사용자의 입력이 어쩌구 하는 것은 둘째치고서라도, 일단 뭔가를 검증하는 곳이기 때문입니다. 친절하게도 "Correct. Move to the next stage" 라는 말은 가슴이 두근거리게도 합니다. 
If 문을 살펴보니 secret 과 stage1 의 값을 서로 비교하고 있습니다. 

secret 값은 주어졌으므로 If 문의 앞 줄에 $stage1=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349) 를 추가해주면 수월하게 넘어갈 것입니다. 물론 리버싱 문제이므로 그냥 저 If 문을 지워버려도 됩니다. 참고로 파워쉘에서 @는 배열을 사용할 때 사용합니다.


일단 사용자의 입력과 유력하게 관련이 있어보이는 stage1이 어떻게 생기는지 한 번 봐 봅시다.


음.. 잘은 모르겠지만 대충 보면, 사용자가 누른 것이 key에 저장되고 그 key 값을 Char 형으로 변환시켜 k에 저장한다음, 그 문자를 f에 저장시켜서, 최종적으로 k에 사용자가 누른 피아노 건반의 알파벳 문자열이 있겠습니다. 그 밑의 If 문을 보면, keytone 배열을 참조하여 입력한 문자를 숫자로 만든 뒤, 버림(floor)을 하고 stage1 배열에 추가해주네요. 그리고 소리(beep)를 내줍니다.


사실 이미 $stage1=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349) 이 되어야한다는 결과 값을 얻었음에도 불구하고, 왜 이 과정을 다시한번 살피는지에 대한 의문이 생길 수 있습니다. 그에 대한 이유는 바로 f 때문입니다. 이 스크립트의 끝 쪽을 보시면 f 가 사용되는 것을 보실 수 있습니다. f 는 이 stage1이 생성되는 과정 속에서 만들어지므로, 우리는 이 f가 무엇인지 확실하게 알아둘 필요가 있습니다.


너무 대충 설명드려서 이해하기 힘드시겠지만, 요컨데 우리는 사용자의 입력 값이 keytone이라는 배열에 들어가서 숫자로 나오게 되는데, 그 결과 값이 $stage1=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)가 되는 입력 값을 찾으면 된다는 겁니다.



keytone 배열이 어떤지가 중요하게 되었으므로 한 번 살펴봅시다.

음.. 이것도 잘은 모르겠지만 대충 살펴보겠습니다. 우선 초기 값을 주었습니다. 초기 값을 준 뒤, 다음 단계에서는 바로 전 단계의 값을 이용하여 keytone 배열을 만들어 가는 방식입니다. 아, pow(2,1/12)는 2의 12분의 1 제곱 값을 뜻합니다. (이 수를 곱하는 것을 보면 꽤나 수가 더럽게 나오지 않을까 싶습니다.)


방금 keytone이 만들어지는 과정을 살펴보았지만, 사실 이 과정은 딱히 유심히 볼 필요까지는 없습니다. 

이 것은 리버싱 문제이기 때문입니다..! 이 문제는 이제 제 겁니다, 제 마음대로 할 수 있는 겁니다.(웃음)


적당한 구문을 추가하여 keytone 배열이 어떻게 생겼는지 알아봅시다.

echo $keytone 을 추가해주면, 다음과 같이 keytone 배열을 확인해보실 수 있을 검니다.

여전히 건반이 예쁩니다.


뭐, 그리하야 $stage1=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)에서 $f="hhjhhjhjkjhjhf" 라는 결과를 얻을 수 있겠습니다.


슬프게도, 아직 플래그를 구하지 못했습니다. 과정이 좀 더 남아있는 것 같으니, 끝까지 가봅시다.

...........

이래저래 살펴보시면, text라는 꽤 긴 문자열이 있는 것을 확인하실 수 있습니다. 끝부분의 =이 사용된 점과 알파벳, 숫자로 이루어진 점, 또 base64 어쩌구 하는 것을 보아하니 text는 base64 인코딩이 되어있는 것을 알 수 있습니다.

밑에 for 문을 대충 살펴보시면, 요약하면 저기 보이는 text의 문자열들을 base64 디코딩을 해서 만든 문자열에다가 아까 구한 f (사용자의 입력 값)를 반복적으로, 문자열이 끝날 때까지, XOR 연산을 수행하여 어떤 문자열을 만들어서 plain에 저장함을 알 수 있습니다.

그런데 이 plain 을 iex를 이용해서 수행하는군요!


iex에 대한 설명은 다음과 같습니다. 


iex 를 이용해서 수행하는 작업이 어떤지 상당히 궁금합니다. 한 번 확인토록 하겠습니다.

역시 적당한 구문을 추가하여 확인해보도록 합시다.


위와 같이 추출을 해보면 다음과 같은 스크립트를 구할 수 있습니다.

....ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ



일단 한 번 실행시켜보도록 하겠습니다.

password를 입력받는 스크립트네요. 코드를 한 번 살펴 봅시다.


허허.. 정말 웃음만 나오는 코드이지만, 대충 잘 정리를 해보면 이렇게 됩니다.

놀랍게도 이 부분들은 정말 장난처럼 생긴 각각의 변수에 어떤 값들을 만들어주고 있습니다. 저 부분만 실행했을 때의 스크립트 상에서 각각의 변수에 대한 정보를 봐 보겠습니다.


아래 쪽의 상황도 한 번 봐보도록 하겠습니다. 스크립트가 바로 실행되기 때문에, 아래의 영역을 살펴보려면 약간의 수정 작업이 필요합니다. 

우선, 중요하게 보아야 할 곳은 & 와 | 가 사용되는 곳입니다. & 에 대한 설명은 아래와 같습니다.

& 이 어떤 작업을 수행하도록 만들어 주기 때문에, | 와 함께 눈여겨 보아야할 겁니다.


하필 {|}를 변수로 사용해서 헷갈릴 수 있지만, 잘 눈여겨 보면, 맨 마지막에 변수로 사용되지 않은 | 두 개와 & 하나를 발견할 수 있습니다.

일단, 뒤에서 차근차근 |를 없애봅시다. 먼저, |&${;} 부분을 없애보았습니다.

저런 식으로 문자열을 만들고 있네요. 그리고 ${;} 가 iex 라는 것을 확인할 수 있습니다. 

저 문자열을 좀 더 가독성있게 정리해보도록 하겠습니다.

다음 작업을 iex 를 통해서 수행되도록 하고 있네요. 코드를 딱 보면 플래그를 알 수 있을 것 같습니다.


flag : SECCON{P0wEr$H311}



번외로, 재미있는 풀이 법도 발견했습니다. powershell ise 환경에서의 디버거를 이용한 방법인데요. 출처는 다음과 같습니다.https://kanglib.pe.kr/hacking/2017/12/23/seccon-2017-quals-powerful-shell.html

디버깅을 하면 저렇게 해석을 해줘서 나올 수도 있군요! :ㅁ 언젠가 도움이 될듯한 방법입니다.


반응형

'Write-up' 카테고리의 다른 글

[pwnable.kr] cmd1 write-up  (0) 2018.01.17
[angr tutorial] ais3_crackme writeup  (0) 2018.01.14
[reversing.kr] ImagePrc writeup  (0) 2018.01.09
[reversing.kr] Easy_CrackMe writeup  (0) 2018.01.08
[SECCON 2017] Vigenere3d writeup  (0) 2018.01.01