• [Flare-on 2019] Demo

    2020. 1. 21.

    by. ugonfor

    문제설명

    프로그램을 실행하면 다음처럼 나타나는 이미지 파일이다.

    Message.txt 에는 다음과 같이 나타나있다.

    Someone on the Flare team tried to impress us with their demoscene skills. It seems blank. See if you can figure it out or maybe we will have to fire them. No pressure.

    결국에는 화면에 무언가가 숨겨져 있는 것으로 보인다...

    Solution

    IDA를 통해서 파일을 보려고 했으나, 디스어셈블링이 되지 않아서 Optional Header를 확인해 보았더니, EntryPoint가 이상하게 되어있는 것을 보고 패킹된 것임을 짐작할수 있다.

    그래서 x32dbg를 이용해서 실행시켜보았다. 패킹된 파일들이 다 그렇듯이 여러 일련의 과정을 거쳐서 패킹이 풀리는 과정을 그래프로 볼 수 있었다. 그래서 마지막 ret에다가 breakpoint를 걸고서 실행시켜보았다.

    ret되는 주소는 0x420000이었다. 이 주소가 OEP이었던 것이다. 그래서 이 주소에다가 break포인트를 두고서 바이너리를 분석해보았다. 그런데 분석을 계속하면서도 이상한 부분이 있었다. 특정 과정이 계속 반복되고 꼭 패킹이 덜 풀린것처럼 바이너리가 동작하는 것이다. 다음은 그부분에 대한 그래프이다.

    그래서, 계속 실행시켜보고 여러번의 시행착오를 걸려서 알아낸 것은 0x4200ac가 실제 main함수의 시작 주소이고, 그전 까지의 과정은 plt를 가져오는 과정인 것이다. (패킹된 바이너리를 많이 분석해보지 않아서, 이부분이 언패킹 과정의 연장선인지 아니면 모든 바이너리들이 거치는 과정인지는 잘 모르겠다.)

    그래서 0x004200ac에다가 break포인트를 걸고서 분석해보았다.

    이때, 분석하기에 매우 도움을 줬던 것이 IAT 목록이다. 다음은 IAT 목록에 대한 사진이다. 이 목록에 대해서 모두 검색해서 알아보았다. Direct3DCreate9 부터 쭉 검색해 보았는 데, 이를 통해서 이게 Direct3D라는 dll을 가져와서 그래픽을 구현하는 파일이라는 것을 알았다.

    다시 메인함수로 돌아가서 분석해보자.

    메인함수는 먼저 3D객체파일을 만드는 것으로 시작한다. 다음은 call부분만 요약해서 본 것이다. 공간을 만든 이후 객체를 만드는 것으로 보인다.

    메인함수의 위쪽부분은 별로 주목할 곳이 없고 확인해야하는 부분은 GetAsyncKeyState 부분을 기준으로 위 아래 함수들이었다.

    파일을 실행시켜보면서 안 것인데, 파일은 flare-on 그림이 무한히 회전하고 있는 그런 내용의 pe파일이다. 그런데, 디버깅을 해보면 오른쪽 아래부분 루프가 무한히 계속 돈다는 것을 알 수 있다. 그래서 저부분은 아마도 파일을 돌아가게 만드는 부분이구나 하고 짐작할 수 있었다.

    이제 이 부분부터 두가지 방법으로 나뉘어 지게 된다. IAT를 중심으로 분석하는 방법과 저 주소로 적혀있는 함수들을 모두 확인해 보는 방법이다.

    사실 두 방법다 답에 가까워 지지만, 나는 적혀있는 함수들을 모두 확인해 보았다.

    이제 4201FF , 4201a2, 42038A, call esi 를 확인해 보겠다.

    4201FF                                                     4201A2                                                          42038a

    사실 call esi까지 확인할 필요도 없었다. 42038A부분을 확인해 보았더니 여러 3D객체 관련된 plt를 호출하고 있을 것을 보아 이 부분이 객체를 구성하는 부분이라는 것을 짐작할 수 있었다.

    정말 긴 시행착오를 걸린 끝에,,,, z축 좌표를 옮겨주면 flag가 나온다는 것을 알 수 있었다...

    다음 사진에 나타난 부분을 0으로 바꿔주면 flag가 뜬다...

     

    그리고 왠지 모르겠으나, 바꾸고 나니 저 je가 루프를 안 돌고 ret으로 가길래 jmp로 바꿔주었다.

    flag: moar_pouetry@flare-on.com


    마치며...

    이 문제에서 가장 어려웠던 것은 패킹되어있어서 그런지 모르겠지만, 동적으로 분석을 해야하는 것이었다. call 0x4205a4 이런식으로 어셈블리가 써져있어도, 그 주소에 가보면 null값만 써져있어서 어셈블리가 없었다. 실제 그 어셈블리가 실행될 때가 되서야만 그 주소에 코드가 쓰여있었다. 그래서 정적으로 분석은 커녕 동적으로 그것도 어셈블리 단위로 분석을 했어야 했다. 그게 가장 어려웠음.

    plt를 보는 게 중요하더라...

    리버싱은 직관이 되게 중요한것 같다.

    apk파일도 만지고 DirectX파일도 만지고 elf파일도 만지고 exe파일도 만지고 그러게 되는 데, pe파일과 elf파일의 경우에는 자주 만지는 파일이기 때문에 좀 익숙하다고 할 수 있지만, 다른 apk나 그런 파일들은 이번에 리버싱을 공부하면서 처음만져보게 되었다. 그런 파일들을 만질 때, 제일 중요한 것은 어떤 부분이 이 파일을 리버싱할 때 중요한 부분인지 알아내는 것이었다. 이는 그런파일들을 개발해보았으면 더 잘 보이겠으나, 그런 파일들을 모두 개발해 볼 수 없으므로 처음보는 유형의 파일을 받았을 때 중요한 것은 감인것 같다.

    앞으로 여러 파일들을 계속 보며 감을 키워야 할 것같다.

    'Writeup > Wargame_Writeup' 카테고리의 다른 글

    [Flare-on 2019] Reloadered  (0) 2020.01.21
    [Flare-on 2019] Snake  (0) 2020.01.21
    [Flare-on 2019] DnsChess  (0) 2020.01.21
    [pwnable.kr] flag  (0) 2020.01.12
    [Flare-on 2019] Flarebear  (0) 2020.01.09

    댓글