올리 디버거를 설치를 했다면 한번 구동을 해보자.
일단 구동 환경을 간단히 써보면
Windows 10 64bit + Ollydbg 2.00 버전
올리 디버거를 시작하면 다음과 같은 화면이 나오게 된다. 4개의 창으로 구성되었는데 설명하면
1. Code Window(좌상단)
기본적으로 Disassembly code를 표시하여 각종 Comment, lable을 보여주며 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다.
2. Register Window(우상단)
CPU register 값을 실시간으로 표시하며 특정 register들은 수정이 가능하다
3. Dump Window(좌하단)
프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니 코드 값으로 표시하고 수정이 가능하다
4. Stack Window(우하단)
ESP register가 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능하다.
일단은 주로 보는 창이 code window인것을 보고 그러면 실제로 디버깅을 해봅시다.
일단은 Hello World.cpp를 빌드를 해야하는데 뭐 코드 자체는 간단하지만 하나 주의 할 점이 있다면
빌드를 할때 Release로 해야합니다. debug로 하면 디버깅 시에 코드가 길어지더군요.
그래서 만들어진 Hello World.exe를 올리 디버거로 열어보면 다음과 같이 나옵니다.
짠. 처음봤을때 뭔가 했습니다. 일단은 code window의 왼쪽을 보면 검정색으로 있는곳이 EP(Entry Point)입니다.
조금 넓혀서 보니 ModuleEntryPoint라고 나오는데 실행 시작 지점이라고 보면 되고 그 옆에 00401250(이것은 실행되는 컴퓨터마다 값이 다를수 있습니다.) 메모리 주소입니다. 그리고 옆에 CALL명령과 JMP명령이 보입니다.
CALL 00401671이라고 나오는데 간단히 설명하면 00401671에서 함수를 호출하라는 명령입니다. 여기서 F7을 누르면 CALL 함수 내부로 들어갈 수 있습니다.
왼쪽 메모리 주소를 보면 00401671로 온 것을 볼 수 있습니다. 뭐 일단은 이런것이 있구나 하고 넘깁니다.
F7버튼을 계속 누르면 밑에 CALL 00401622에서 또 그 메모리로 가서 함수를 보고 오면서 복잡해주기 때문에 쓸데없는 함수는 보지 않고 실행만 하겠다하면 F8 버튼을 눌러주면 함수 내부로 들어가지 않습니다.
쭉 내리다 보면 RETN이라는 command가 보이는데 Return을 하면 다시 함수를 빠져 나와서 다음으로 넘어갑니다. RETN에서 F7을 눌러줍시다.
원래 처음부분에서 하나내려와서 JMP 004010E6으로 내려온 것을 볼 수 있습니다.
참고로 CALL함수를 계속 따라가다가 해맨 것 같다면 Ctrl+F9를 눌러주시면 바로 RETN으로 탈출할 수 있고 이도저도 안되면 Ctrl+F2를 눌러주시면 재실행이 됩니다.
이렇게 반복하다면 main()함수를 찾아 볼 수 있는데..(솔직히 이게 처음 볼때는 뭐가 메인 함수인지도 모름.) 일단은 F7,F8차이점과 재시작인 Ctrl + F2, 함수 탈출 Ctrl+F9를 여러번 눌러보면서 대충 뭐가 뭔지 알수 있게 해봅시다.
JMP 004010E6을 일단은 들어가서 Main()함수가 어디나 있는지 확인을 해봅시다.
Jmp명령을 통해 004010E6로 들어온 모습입니다. 여기서 여러 CALL 함수가 있는데 F7과 F8을 통해서 보거나 스킵을 해서 내려보시면
CALL 00401000 이부분을 볼 수 있습니다.여기서 F7을 해서 들어가면
이런 화면을 볼수 있는데 여기가 바로 main()함수입니다. 일단 Comments를 보면 UNICODE 해서 문자열 입력이 있고 밑에 CALL DWORD PTR DS:[<&USER32.MessageBoxW>] 나오는 부분을 보면 Main()함수라는 것을 알 수 있습니다.
솔직히 처음하면 몇시간 해매는데 여러번 해보면 그래도 대충 감이 잡히실겁니다. 중요한거라고 하면 단축키정도인데 정리를 해보겠습니다.
명령어 |
단축키 |
설명 |
Restart |
Ctrl+F2 |
다시 처음부터 디버깅 시작 |
Step Into |
F7 |
하나의 OP Code를 실행(CALL일 경우 그 함수 내부로 들어간다) |
Step Over |
F8 |
하나의 OP Code를 실행(CALL일 경우 그 함수 내부로 들어가지 않고 단순 실행) |
Execute till Retrun |
Ctrl+F9 |
함수 내부의 RETN까지 실행. 함수 탈출 목적 |
이렇게 정리하면 되겠네요.
'리버스 엔지니어링' 카테고리의 다른 글
리틀 엔디언 표기법 (0) | 2018.01.04 |
---|---|
Hello World 문자열 패치 (0) | 2018.01.03 |
Ollydbg BP 설치 방법 (0) | 2018.01.03 |
리버스 엔지니어링 환경 구축 (0) | 2018.01.02 |
리버스 엔지니어링이란 (0) | 2018.01.02 |