상세 컨텐츠

본문 제목

2013 CODEGATE YUT BINARY 300 Write-up | 2013 코드게이트 바이너리 300 풀이

0x10 정보보안/0x14 Reverse Engineering

by sweetchip 2013. 3. 8. 23:19

본문

반응형


대회 참가를 몇시간 밖에 못해서 그냥 열어보기만 했던 문제를 다시 한번 풀어봤습니다.


마지막 답 확인할때와 안풀리는 부분 딱 한곳은 다른분의 풀이를 살짝 봤습니다.


분석같은건 제데로 되었네요


역시 리버싱은 어렵습니다 ㅠ-ㅠ


대략 푸는데 합쳐서 5시간 정도 걸렸군요.




8c12466a19b6b75f0485e90a2d753672





Password Required... 크랙미 문제인가? 하고 생각중인데


코드게이트에서 단순한 크랙미문제는 나올리 없겟다.. 생각을 했습니다.


일단은 어떻게 되나~ 엔터를 눌러봤습니다.



음.. 이건 또 무슨.. ㅠㅠ


묻지도 따지지도 않고 OllyDBG에 Attach 시킵니다.



일단 위 위 사진의 메세지를 띄우는 루틴은 사진이 지워졋네요.


그 루틴에서 한단계 위로 빠져나오고 조금 살펴보면 위같이 파일을 생성하는 루틴을 볼 수 있습니다.



음.. 프로그램을 실행한 폴더에 .unprotect 라는 확장자를 붙여서 파일을 생성합니다.



이곳이 문제의 시리얼을 입력하는 곳입니다.


그런데 시리얼에 따라 답이 달라질줄 알았는데 아니라서 그냥 패치 했습니다.


키 값은 10자리 더군요. 궁금하신분은 한번 직접 구해보시는것도 :D


일단은 풀이상에 문제가 없으므로 그냥 진행했습니다.


자.. 그리고 아래로 내려가면



무언가와 0x0ca 로 Xor 연산을 진행합니다. 뭔고 하고 바로 찾아가 봤습니다.



아니!! 이것은 딱봐도[?] 암호화된 메세지 일겁니다.


그래서 한번 xor 연산을 진행시키기로 했습니다.



그랫더니 MZ 파일이 튀어나오네요.


이때 답이 나왔으면 좋으련만 다시한번 불안감이 밀려옵니다. ㅠㅠ


일단은 4KB씩 복호화 하는것 같더라구요.


4KB씩 총 25번을 반복해서 마침내 100KB의 exe 파일을 생성하고 맨밑에 붙은 쓰레기 부분을 제거 한뒤 프로그램이 종료되었습니다.


그런데 unprotect 파일이 사라지더군요.


알고보니 마지막에 파일을 지우는 착한 프로그램이었던것을 알게 되었습니다.


그래서 파일을 지우기 전에 복사하기로 가져왔습니다.



파일은 숨김파일로 만들어졌군요.


도데체 뭐가 있길래..



일단 파일명을 약간 정상적으로 변경하고 확인사살차 HEX Editor 로 살펴봣습니다.




확실한 EXE 파일이라는 것을 확인하고 기분좋게 파일을 실행했습니다.



그러자 친절하게 오류를 토해내시는 우리 프로그램님..


아.. 잠시 쉬고 PE 헤더를 살펴봤습니다.



처음 출제된 문제와 하나하나 비교를 하다 보니


문제는 바로 저곳에 있었습니다.


operating system 과 subsystem version 이 7.1로 되어있어서 다음과 같이 변경했습니다






이제 바꾸고 저장까지 했으니 오류가 안나올거라고 예상하고 설레는 맘으로 프로그램을 구동시켰습니다.



이제야 본격적인 리버싱이 시작됩니다.


노트가 랜덤적으로 생성이 된다는 군요.


자, 잠깐 힌트를 살펴보겠습니다.


[Bin 300 Hint] Routine that makes the "Note"

- 노트를 만드는 루틴


[Bin 300 Hint2] Find out notes that are created in somewhere where is not 1,2,3 difficulty level, and output it.

- 레벨 1,2,3 에서 만들어지는 노트 말고 다른 레벨에서 만들어지는 노트를 찾고 출력하세용~


힌트를 봐도 감이 안오네요. 엉엉


그래서 고민을 하던차에 그냥 일단은 플레이 해보도록 했습니다.



스타트와 동시에 글자가 내려갑니다.



그리고 신기하게도 노트가 막 내려옵니다.


콘솔로 이런게 가능하다니 놀랍군요!


잠시 문제 출제자 분께 감탄을 하고 올디로 얼른 Attach 시켰습니다.



레벨 입력을 구하고 3, 2, 1 순으로 비교하는 루틴입니다.


그리고 cls 명령어와 함께 다른 함수로 넘어갑니다. [최종 목적지는 노트 생성과 플레이 하는 루틴입니다.]



그런데 1도 아니라면 4와 비교하는 루틴이 있었습니다.. 헉!


아마 이것이 힌트 2번과 연결되는것 같습니다.


레벨 4로 노트를 생성한다면 키가 출력될것이라고 믿고 풀이를 계속했습니다.


[하지만 레벨4를 선택시 범위이내가 아니라며 종료됩니다. 강제로 노트생성을 할 필요가 있어 보입니다.]




잠시 또 휴식을 하고 쭈욱 훑어보는데 상당히 더러워 보이는 함수가 눈에 띄었습니다.



바로.. 이것..


한눈에봐도 이건 뭐.. 라는 말이 나옵니다.


딱 봐도 이게 아마 노트를 생성하는 루틴일것이다 라는 것을 예상하고 맨앞에 브포를 걸고 살펴본결과 역시나였습니다.



다시 거슬러 올라와서 레벨이 저장된 부분의 메모리를 살펴봤습니다.


일단 저 148470는 다시 쓰일 확률이 높으니 기억해두고 있겠습니다.



아스키로는 이상해 보이는 모양이지만 Hex Code 로 확인해보면 0x01 이 저장되어있습니다. [현재 레벨 1을 선택한 상태입니다.]



아까 기억해둔 148470 주소를 노트생성 루틴에서 찾아본 결과 총 3군데에서 이용하고 있었습니다.


이떄 첫번째와 두번째는 노트 생성에 사용하고 있으며 세번째는 따로 풀이에 필요하지 않아서 분석하지 않았습니다.



저장된 레벨의 값을 4[0x04]로 강제로 변경한뒤, 노트 생성을 시킵니다.


적당한곳에 브포를 걸고 노트가 모두 생성되길 기다립니다.



오! 레벨 4의 노트가 새로 생겼습니다.


이제 F9를 누르면 위 노트가 저의 눈을 즐겁게 해줄겁니다.


..

..

..

..

..



그런데 문제가 생겼습니다.


저 노트들이 안뜨더군요...


그래서 조금더 분석해본 결과 엉뚱한 주소에서 노트를 출력하고 있었습니다;;


이것때문에 몇시간 삽질했었습니다.. ㅠ-ㅠ


알고보니.. 레벨 4의 노트가 찍힌 부분은 1,2,3 이 찍힌 부분과 다른것 같군요.



[Bin 300 Hint2] Find out notes that are created in somewhere where is not 1,2,3 difficulty level, and output it.

- 레벨 1,2,3 에서 만들어지는 노트 말고 다른 레벨에서 만들어지는 노트를 찾고 출력하세용~



다시 힌트를 보고나니 이해가 갈만합니다.


and output it. 출력하세요!



실제로 위 0x0269a10c 주변의 start!! 부터가 레벨4의 노트가 생성된 부분이고 조금 아래로 내려보면



또 똑같은 start!! 가 있습니다. [주소를 잘 보세요.]



이곳은 노트도 키도 없는 평화로운 00 과 20 지대입니다.


그래서 생각해낸 방법이..


복붙!



실제로 생성된 Level4의 노트를 실제로 출력되는 부분에 Paste 했습니다.



그러자 제 눈을 즐겁게 해줄 글자가 나타났습니다.








처음엔 메모장을 켜고 얼른 SUOICERP SI EYE 를 적었지만 뭔가 이상한 낌새가 있어서..


거꾸로 본 결과!



Password Is EYE IS PRECIOS



ps. 지금은 200점짜리와 400점짜리를 삽들고 땅파는 중입니다.

반응형

관련글 더보기