1. Hello World 프로그램
1.1 디버거와 어셈블리 언어
소스코드(.cpp) ➜ 빌드 ➜ 실행 파일(.exe) 생성
사람이 이해하기 쉬운 소스코드를 기계가 이해하기 쉬운 기계어로 변환하는 것
기계어는 사람이 알아보기 어렵기 때문에 좀 더 편하게 보기 위해 디버거 유틸리티를 사용한다.
📌 실행 파일을 생성하는 어떠한 프로그래밍 언어라도 빌드 과정을 거치면 모두 기계어로 변환된다.
디버거를 통해 어떤 실행 파일이라도 어셈블리 언어로 번역해서 볼 수 있기 때문에 리버서는 기본적으로 어셈블리 언어를 잘 알아야 한다.
어셈블리 언어는 CPU에 종속됨
- 일반 PC 多 사용 : Intel x86 계열
- 모바일 제품 多 사용 : ARM 계열
➜ 서로 어셈블리 명령어의 형태가 다름
2. HelloWorld.exe 디버깅
2.1 디버깅 시작
💡 OllyDbg는 직관적인 인터페이스와 강력한 확장 가능으로 무장한 Win32 디버거이다.
Code window | 기본적으로 disassembly code를 표시하여 각종 comment, table을 보여주며, 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다. |
Resgister window | CPU registet 값을 실시간으로 표시하며 특정 register들을 수정도 가능하다. |
Dump window | 프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능하다. |
Stack window | ESP register가 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능하다. |
2.2 EP(Entry Point)
EP(Entry Point)는 HelloWorld.exe의 실행 시작 주소(00D811A1)이고,
위 두줄의 의미는 "00D8284C 주소의 함수를 호출(CALL)한 후 00D8104F 주소로 점프(JMP)하라" 이다.
Address | 프로세스의 가상 메모리 내의 주소 |
Instruction | IA32 CPU 명령어 |
Disassembled code | OP code를 보기 쉽게 어셈블리로 변환한 코드 |
comment | 디버거에서 추가한 주석(옵션에 따라 약간씩 다르게 보임) |
2.3 00D8284C 함수 따라가기
Ollydbg 기본 명령어
명령어 | 단축키 | 설명 |
Restart | Ctrl+F2 | 다시 처음부터 디버깅 시작(디버깅을 당하는 프로세스를 종료하고 재실행) |
Step Into | F7 | 하나의 OP code 실행(CALL 명령을 만나면, 그 함수 코드 내부로 따라 들어감) |
Step Over | F8 | 하나의 OP code 실행(CALL 명령을 만나면, 따라 들어가지 않고 그냥 함수 자체를 실행) |
Execute till Return | Ctrl+F9 | 함수 코드 내에서 RETN 명령까지 실행(함수 탈출 목적) |
EP 코드의 00D811A1 주소에서 Step Into[F7] 명령어를 사용하여 00D8284C 함수 내부로 따라갈 수 있다.
- comment의 빨간색 부분 : 코드에서 호출되는 API 함수 이름
- D828E1 주소의 RETN 명령어 : 함수의 끝에서 사용되며 이 함수가 호출된 원래 주소로 돌아간다.
- 위 캡쳐의 API 함수들은 Visual c++에서 프로그램 실행을 위해 추가시킨(우리 소스코드에는 없는) Visual C++ stub Code 이다. ➜ main()함수가 아니므로 우리의 목표인 main()함수를 찾아 계속 진행하겠다.
① RETN 명령어까지 Step over[F8] 하거나 Execure till Return[Ctrl+F9] 명령으로 한 방에 이동
② RETN 명령어를 실행[F7/F8] 하면 그림 2.2의 00D811A6 주소로 오게 된다.
2.4 D8104F 점프문 따라가기
00D811A6 주소의 00D8104F 명령을 실행해서 D8104F 주소로 간다.
이 코드 역시 Visual C++ Stub Code이며, 코드를 따라가다보면 우리의 목표인 main() 함수를 만날 수 있다.
📌 초보자는 사용자 코드인지 Stub Code인지 알아보기 어렵기 때문에 각종 개발도구로 생성된 파일을 많이 접해보면 향후 이런 부분은 빨리 건너뛸 수 있다.
3. 디버거 좀 더 능숙하게 다루기
3.1 베이스캠프
베이스캠프란 디버깅을 진행하면서 중간중간 코드에서 분석을 원하는 중요 포인트(주소)를 지정해 놓은 후 그 포인트로 빠르게 갈 수 있는 방법을 잘 기록해 놓는 것.
3.2 베이스캠프를 설치하는 4가지 방법
1) Goto 명령
베이스캠프 주소를 잘 기억해 두었다가 Go to[Ctrl+G] 명령으로 원하는 곳으로 갈 수 있다.
2) BP 설치
베이스캠프로 가는 또 다른 방법은 BP(Break Point)를 설치[F2]하고, 실행[F9]하는 것이다. (가장 많이 사용하는 방법)
디버거는 현재 시행 위치에서부터 프로세스를 실행하다가 BP가 걸린 곳에서 멈추게 됨
메인 메뉴의 View-BreakPoint를 선택(단축키 ALT+B)하면, BreakPoint 목록이 나타난다.
3) 주석
[;] 단축키로 주석을 달고, 이 주석을 찾아가는 방법
프로그래밍과 마찬가지고 디버깅에서 주석은 매우 중요하다.
마우스우측 메뉴의 Search for - User-defined comment 항목을 선택하면, 사용자가 입력한 주석들이 표시된다.
빨간 글씨가 커서 위치, 검은 글씨가 찐 주석이다. 해당 주석을 더블클릭하면, 그 주소로 갈 수 있다.
4) 레이블
레이블은 원하는 주소에 특정 이름을 붙여주는 유용한 기능이다.
그냥 주소에 레이블을 붙이게 되면 매우 직관적으로 변경되어 디버깅할 때 매우 편함.
4. 원하는 코드를 빨리 찾아내는 4가지 방법
실행 파일의 EP 주소에 바로 main() 함수가 나타나는 것이 아니로 개발 도구(Visual C++)의 Stub COde가 나타나는 것을 알았다.
main() 함수는 EP 코드에서 한참 떨어져 있고 이 함수를 바로 찾아갈 수 있다면 디버깅에 큰 도움이 될 것이다.
4.1 코드 실행 방법
우리가 원하는 코드 = main() 함수의 MessageBox() 함수 호출 코드
Reference
'Security > Reversing' 카테고리의 다른 글
[Reversing] 05. 스택 (0) | 2021.11.26 |
---|---|
[Reversing] 04. IA-32 Register 기본 설명 (0) | 2021.11.25 |
[Reversing] 03. 리틀 엔디언 표기법 (0) | 2021.11.25 |
[Reversing] OllyDbg 기초 사용법 (0) | 2021.11.25 |
[Reversing] 01장. 리버싱 스토리 (0) | 2021.11.21 |