Mafa Dev
CrackMe 문제 풀이 ( abex1 ) 본문
리버싱 관련 연습을 위해서 만든 실행 파일을 Crack Me 문제라고 합니다
가장 기본이 되는 CrackMe 문제를 풀어보면서 소프트웨어의 흐름을 바꾸어 놓는 것을 설명하려고 합니다. 그 과정에서 리버싱을 하면서 필요한 기본적인 어셈블리를 정리하도록 하겠습니다.
문제 파일은 외국에서 제작된 CrackMe 파일을 가지고 설명하려고 합니다.
원래는 국내에서 리버싱과 관련해서 손꼽힐 정도로 오랫동안 사이트가 유지되었던 http://learn2crack.com으로 접속해서 문제들을 다운받으려고 했지만 현재는 이 사이트가 막힌 상태로 http://simples.kr/ 에서 크랙 문제를 다운받으시면 됩니다. CrackMe 파일뿐만 아니라 많은 리버싱 문제들이 있으니 자주 이용해 주셧으면 합니다.
먼저 abex1 문제 부터 풀어나가도록 하겠습니다.
http://simples.kr/index.php?mid=BookList&category=1940&document_srl=3811 로 들어가시면 바로 다운 받으실 수 있습니다.
파일을 다운로드 받아서 압축을 풀면 , abexcm1.exe 문제 파일과 abex1.txt 문제를 요약한 텍스트 파일이 있는데요
CDrom을 체크하는 루틴이 들어있는 쉬운 난이도의 문제입니다.
이번에 나올 내용들은 아주 쉬운 내용이지만 자주 써야 하는 단축키들이 많이 나오거나 기본적으로 원하는 흐름을 찾는 방법을 중점적으로 설명할 것이므로 최대한 익숙해지는 것이 중요합니다.
먼저 올리디버거를 실행하고, 'File -> Open -> abexcm1.exe' 를 선택합니다.
문제 파일이 로드되는 것을 볼 수 있는데요. 이 프로그램이 어떻게 작동하는지 확인하기 위해서 일단 주황색으로 네모박스 쳐져있는 ▶ 화살표 모양 (F9)을 눌러 실행해 봅니다.
첫 번째 알림창이 나타나고, 확인을 클릭하면 두 번째 알림창이 나타납니다.
그리고 나서 올리디버거를 보면 프로그램이 종료되었음을 알 수 있습니다.
Terminated를 해석하면 '종료되다' 라는 의미입니다.
알림 메세지를 보면 CDROM을 체크하는 루틴을 우회하라고 나오고, CDROM이 아니라는 경고창이 뜨고 , 프로그램이 종료됩니다. 이 문제는 메모리 주소 흐름을 바꾸는 것을 먼저 보여주고 다른 풀이 방법을 설명할 것입니다.
먼저 기초적인 방법으로 문제를 풀어보면 해당 알림창에 나타난 문자열을 프로그램 내부에서 검색해서 CDROM을 체크하는 부분을 변경하는 것입니다.
취약한 프로그램에 대한 리버싱을 하는 순서를 정리하면 다음과 같습니다.
1. 프로그램 흐름 분석
2. 프로그램 문자열을 이용한 특정 이벤트 시점 찾기
3. 성공하였을 경우의 문자열 위치를 찾아 무조건 성공하도록 흐름을 변경
프로그램이 어떤 작동을 하는지는 확인해 보았으니 문자열을 찾아보도록 하겠습니다.
올리디버거를 다시 보면 프로그램이 종료되어 있는 상태이니 프로그램을 재시작합니다.
◀◀ 버튼 (Ctrl + F2)를 눌러, 프로그램을 재시작하고, 디스어셈블된 코드가 보이는 화면에서 마우스를 우클릭하고 메뉴에서 'Search for -> All referenced text strings' 메뉴를 선택합니다.
문자열 목록을 보면, CDROM이 인식되었을 경우에는 00401044 주소의 값이 출력되는 것을 예상할 수 있습니다.
해당 문자열을 더블클릭하면 해당 주소지로 이동합니다
어셈블리 코드들과 메모리 주소지들이 나타나며, 우측에는 문자열들과 윈도우 API 함수명들을 볼 수 있습니다.
여기서 윈도우 API가 무엇인지 모르는 분들을 위해서 잠깐 설명을 하겠습니다.
WinApi는 윈도우에서 제공하는 API라는 뜻으로 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있도록 만든 인터페이스를 뜻합니다. 주로 파일 제어, 윈도우 제어 , 화상 처리, 문제 제어 등을 위한 인터페이스가 제공됩니다.
윈도우에서 프로그램을 구현할 때 운영체제가 지원하는 API를 사용하여 프로그램을 짜면 되는 것이기 떄문에, 리버싱을 할 때 역으로 어떤 API가 사용되었는지를 알면 어떤 기능을 하는 프로그램인지 예상할 수 있는 것입니다.
이제 다시 올리디버거 화면을 보면 어셈블리 언어들이 가득 있을 것입니다.
00401026 :. /74 15 JE SHORT abexcm1.0040103D |
화면에서와 같이 JE로 된 부분에는 좌측에 점프해서 이동하는 부분이 나타납니다 ( 설정법은 올리디버거 설치 및 설정 방법 부분을 참고합니다.)
자세한 내용을 모르더라도 JE 부분이 "Nah... This is not a CD-ROM Drive!"라는 메시지와 "Ok, I really think that your HD is a CD-ROM! :p" 메세지가 표시되는 분기점임을 알 수 있습니다.
여기서 JE에 대한 어셈블리어를 간단히 설명하고 , 문제 풀이 후에 정리를 하도록 하겠습니다.
일단 문제를 풀기 위한 지식을 설명하자면 JE는 'jump if equal'의 의미로서 ZF 플래그가 1과 같으면 점프를 하겠다는 뜻입니다.
그냥 두면 점프를 하지 않으므로 강제로 점프를 하도록 JE를 JMP로 변경해보겠습니다.
00401026 :. /74 15 JE SHORT abexcm1.0040103D |
위의 주소에서 Space Bar를 누르거나 우클릭 메뉴에서 Assemble을 선택하고 JE를 JMP로 수정합니다.
수정을 하고 나서 실행(F9)을 해봅시다.
의도한 대로 문제가 풀어졌습니다. 여기서 중요한 점은 문자열을 검색해서 어떤 부분을 분석해야 하는지 찾는 부분과 간단한 어셈블리어 지식을 사용하여 프로그램의 흐름을 바꾸었다는 것입니다. 이제 이렇게 수정한 내용을 파일로 저장을 해볼 차례입니다.
수정한 부분에서 우클릭 메뉴를 호출하고, 'Copy to executable -> All modifications'를 선택합니다.
Copy all 메뉴를 선택합니다.
그러면 수정된 어셈블리어들이 나타난 창이 나타나고 그 창에서 우클릭 메뉴를 호출하면, Save file이라는 메뉴가 나타납니다.
문제를 풀고 나서 답을 저장하면 abexcm1 문제는 끝이 납니다.