[기초 리버싱] 02. Hello World! 리버싱
목차
2.1 Hello World! 프로그램
Visual C++로 소스코드 작성, Release 모드로 빌드하여 실행 파일을 만들기
2.1.1 디버거와 어셈블리 언어
어셈블리 언어를 잘 익혀 두면, 실행 파일이 어떤 프로그래밍 언어로 제작되었는지 상관없이
디버깅을 통한 코드 분석이 가능하다.
2.2 HelloWorld.exe 디버깅
2.2.1 디버깅 시작: OllyDbg
(1) Code Window
기본적으로 disassembly code를 표시하여 각종 comment, label을 보여줌
코드를 분석하여 loop, jump 위치 등의 정보를 표시
(2) Register Window
CPU 레지스터 값을 실시간으로 표시하며 특정 레지스터들은 수정도 가능
(3) Dump Window
프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능
(4) Stack Window
ESP 레지스터가 가리키는 프로세스 stack memory를 실시간으로 표시, 수정도 가능
2.2.2 EP
EP(Entry Point)
: Windows 실행 파일(EXE, DLL, SYS 등)의 코드 시작점
- CPU에 의해 가장 먼저 실행되는 코드 시작 위치
* Address: 프로세스의 VA 내의 주소
* Instruction: IA32(또는 x86) CPU 명령어
* Disassembled code: OP code를 보기 쉽게 어셈블리로 변환한 코드
* comment: 디버거에서 추가한 주석
2.2.3 함수 따라가기
OllyDbg 기본 명령어를 이용해서 따라가보자. (밑에 정리할 예정)
* Visual C++ Stub Code: Visual C++에서 프로그램 실행을 위해서 추가시킨 것
: 개발 도구에 따라 달라지며, 그 안의 버전에 따라서도 달라진다.
* RETN: 함수의 끝에서 사용
2.2.4 main() 함수 찾기
* main() 함수 찾는 루틴
1. F7 명령으로 디버깅 해나가면서 함수 호출을 만나면 따라 들어간다.
2. 안의 코드를 확인하고 main() 함수인지 확인
3. 아니라면, Ctrl+F9 명령으로 해당 함수 탈출
>> 위를 main() 함수 찾을 때까지 반복한다.
2.3 디버거 좀 더 능숙하게 다루기
2.3.1 베이스캠프
* 베이스캠프
: 중간중간 코드에서 분석을 원하는 중요 포인트(주소)를 지정해 놓은 후, 그 포인트로 빠르게 갈 수 있는 방법을 잘 기록해 둔다.
2.3.2 베이스캠프를 설치하는 4가지 방법
1) Goto 명령
Ctrl+G 명령으로 기억해 둔 베이스캠프 주소로 간다.
간 후, F4 명령으로 그곳까지 실행한다.
2) BP 설치
BP를 설치(F2)하고, 실행(F9)
3) 주석
; 단축키
4) 레이블
원하는 주소에 특정 이름을 붙여주는 것
: 단축키
2.4 원하는 코드를 빨리 찾아내는 4가지 방법
(1) 코드 실행 방법
프로그램의 기능이 명확한 경우에 명령어를 하나하나 실행하면서 원하는 위치를 찾아가는 방법
- 코드의 크기가 작고, 기능이 명확한 경우에 사용
(2) 문자열 검색 방법
마우스 우측 메뉴 - Search for - All referenced text strings
All referenced text strings 명령: 프로세스 메무리를 죽 훑어 참조되는 문자열과 호출되는 API들을 뽑아내서 따로 목록으로 정리해 놓은 것
** 코드와 데이터 영역은 서로 나뉘어져 있다는 것 알아두기
(3) API 검색 방법 1 - 호출 코드에 BP
마우스 우측 메뉴 - Search for - All intermodular calls
All intermodular calls 명령: 사용되는 API 함수 목록을 뽑아낸 것
(4) API 검색 방법 2 - API 코드에 직접 BP
마우스 우측 메뉴 - Search for - Name in all modules
Packer/Protector을 사용하여 실행 파일을 압축하면, OllyDbg에서 API 호출 목록이 보이지 않게 된다.
* Packer: 실행 파일의 코드, 데이터, 리소스 등을 압축시킴
* Protector: 압축 기능 외에 anti-debugging, anti-emulating, anti-dump 등의 보호 기능을 추가한 유틸리티
>> 이런 경우 프로세스 메모리에 로딩된 라이브러리(DLL 코드)에 직접 BP를 걸어보는 것이다.
** API: C:\Windows\system32 폴더에 *.dll 파일 내부에 구현돼 있음.
- API를 사용해 OS에게 요청해야 하고, 그 API가 실제 구현된 시스템 DLL 파일들은 프로그램의 프로세스 메모리에 로딩돼야 한다.
Name in all modules 명령: 프로그램 실행을 위해 같이 로딩된 시스템 DLL 파일이 제공하는 모든 API 목록을 보여줌
2.5 "Hello World!" 문자열 패치
2.5.1 패치
: 버그를 수정하거나, 새 기능을 추가할 수 있다.
- 대상: 파일, 메모리, 프로그램의 코드와 데이터 모두 패치가 가능
2.5.2 문자열을 패치하는 두 가지 방법
1) 문자열 버퍼를 직접 수정
* UNICODE 문자열을 변경하기
- 주의: 유니코드 문자열은 2byte 크기의 NULL로 끝나야 함.
* 파일로 생성하기
dump 창에서 변경된 내용을 선택 > Copy to executable file 메뉴 선택 > Save file 메뉴 선택
2) 다른 메모리 영역에 새 문자열을 생성하여 전달
ex. MessageBoxW() 함수에 들어가는 파라미터의 문자열 주소를 변경해서 전달한다면?
>> 적당한 메모리 영역에 패치하고자 하는 긴 문자열을 적어놓고, 함수에게 그 주소를 파라미터로 넘겨주는 것.
** 메모리 어느 영역에 문자열을 써야 하는가?
** 프로그램이 메모리에 로딩될 때 최소 기본 단위로 크기가 잡힌다.
2.6 마무리 (명령어, 단축키 정리)
1) OllyDbg 기초 사용법
명령어 | 단축키 | 설명 |
Step Into | F7 | 하나의 OP Code 실행(코드 내부로 들어감) |
Step Over | F8 | 하나의 OP Code 실행(들어가지 않고 함수 자체를 실행함) |
Restart | Ctrl + F2 | 다시 처음부터 디버깅 시작 |
Go to | Ctrl + G | 원하는 주소를 찾아감 |
Run | F9 | 실행(BP 걸려있으면 거기서 실행 정지됨) |
Execute till return | Ctrl + F9 | 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출 목적) |
Execute till cursor | F4 | cursor 위치까지 실행함(디버깅하고 싶은 주소까지 바로 갈 수 있음) |
Comment | ; | |
User-defined comment | Search for - User-defined comment | 사용자가 입력한 comment 목록 보기 |
Label | : | |
User-defined label | Search for - User-defined label | 사용자가 입력한 label목록 보기 |
Breakpoint | F2 | |
All referenced text strings | Search for - All referenced text strings | 코드에서 참조되는 문자열 보기 |
All intermodular calls | Search for - All intermodular calls | 코드에서 호출되는 모든 API 함수 보기 |
Name in all modules | Search for - Name in all modules | 모든 API 함수 보기 |
Edit data | Ctrl + E | 데이터 편집 |
Assemble | Space | 어셈블리 코드 작성 |
Copy to executable file | Copy to executable file | 파일의 복사본 생성(변경 사항 반영됨) |
2) Assembly 기초 명령어
1. CALL XXXX
2. JMP XXXX
3. PUSH XXXX
4. RETN
3) 프로세스 data/code 패치 방법
OllyDbg의 'Edit data', 'Assemble' 기능 이용
4) 용어
- VA: 프로세스 가상 메모리
- OP code: CPU 명령어(바이트 code)
- PE(Portable Executable): Windows 실행 파일(EXE, DLL, SYS 등)
- Stub Code: 컴파일러가 임의로 추가시킨 코드
: 특히 EP 코드 영역에 추가시킴 (->StartUp Code)
'write-up > reversing' 카테고리의 다른 글
[기초 리버싱] 03. 리틀 엔디언 표기법 (0) | 2019.09.17 |
---|---|
[기초 리버싱] 01. 리버싱 (0) | 2019.09.17 |
댓글