< 리버싱 핵심원리 소스코드/실습예제 파일다운 >
"리버싱 핵심 원리" 소스 코드와 실습 예제 파일입니다.
(2021.07.08) github.com 에도 제 계정을 생성하여 소스코드 및 실습예제를 올렸습니다. github 에 익숙하신 분들께서는 이곳을 이용하시면 됩니다. https://github.com/reversecore/book 1. 소스 코드 (ver 1.0.2) * 암
reversecore.com
1. Hello World 프로그램
- Release 모드로 HelloWorld.exe 를 만들어 보자( Release 모드로 컴파일하면 코드가 간결해져 디버깅하기 편하다)
//HelloWorld.cpp
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR *argv[])
{
MessageBox(NULL,
L"Hello World!",
L"www.reversecore.com",
MB_OK);
return 0;
}
2. HelloWorld.exe 디버깅
2.1 Hello world 디버깅 목표
- 어셈블리 언어로 변환된 main() 함수 찾기
- 기본적인 디버거 사용법 학습
- 어셈블리 명령어 학습
2.2 HelloWorld.exe. 디버깅 시작
(1) Code Window
- 기본적으로 diassembly Code 를 표시한다.
- 각종 comment, label 을 보여준다.
- 코드를 분석하여 loop, jump, 위치등의 정보를 표시한다.
(2) Register Window
- CPU Register 값을 실시간으로 표시한다.
- 특정 Register의 값은 수정도 가능하다.
(3) Dump Window
- 프로세스에서 원하는 memory 주소 위치의 값을 hex와 asscii/유니코드 값으로 표시한다.
- 수정가능
(4) Stack Window
- ESP Register가 가리키는 프로세스 Stack Memory를 실시간으로 표시한다.
- 수정가능
2.3 EP (Entry Point)
- 엔트리 포인트(Entry Point)는 제어가 운영 체제에서 컴퓨터 프로그램으로 이동하는것을 말하며, 프로세서는 프로그램이나 EP가 코드에 진입해서 실행을 시작한다.
- PE 파일을 분석해서 EP값을 알아 낼 수도 있다.
> 위 사진과 같이 Hello World.exe를 디버거로 열었을때 EP(Entry Piont)에서 멈추는걸 알수 있다.
(1) address
- 프로세스의 가상 메모리 (Virtual Address:VA) 내의 주소
(2) instruction
- IA-32(또는 x86) CPU 명령어
(3) Disassembled Code
- OP 코드를 보기 쉽게 어셈블리어로 변환한 코드
(4) Comment
- 디버거에서 추가한 주석 ( 옵션에 따라 약간 다르게 보임)
2. 4 40270C 함수 따라가기
> 이제 Main() 함수를 찾기위해 Step into 명령어 [F7] 를 사용해 40270C 함수 코드 내부로 들어가보자
함수 내부로 들어오자 새로운 코드들이 나타난다. 먼저 주석에서는 코드에서 호출되는 API 함수이름을 보여준다. 우리는 이미 Main() 함수가 어떻게 생긴지 알기때문에 이번에는 Step over 명령어 [F8] 을 사용해 함수 내부로 진입하지 않고 하나하나 실행해보자 ( Ctrl + [F9] 명령어 사용시 함수의 RET까지 빠르게 실행 할수 있다)
4027A1 주소에 RETN 명령어가 있는걸 알수있다. RETN은 함수의 끝에서 사용되며 이 함수가 호출된 원래 주소 쪽으로 되돌아간다. 위 경우는 리턴주소가 4011A5이다. [F8]을 눌러 리턴주소로 이동하자
2.5 40104F 점프문 따라가기
4011A5 주소의 JMP 40104F 명령을 실행( [F8] ) 해서 해당 주소로 가보자
다시 40104F 주소부터 함수 호출 명령어를 하나하나 따라가보자... 저자께서 처음엔 귀찮더라도 하나하나 다 실행보고 가라고 하셨다
2.6 Main() 함수 찾기
쭉~~ 따라가 보다 보면
401144 주소에 CALL 401000 호출하는 명령어가 있는데 Step into [F7] 로 들어가보면 MessageBoxW() API를 호출하는 코드를 확인 할 수 있다. 그 API의 파라미터가 "www.reversecore.com"과 "Hello World!" 문자열인것으로 보아 우리가 찾던 Main() 함수인걸 알 수 있다.
3. 디버거 능숙하게 다루기
3.1 디버거 명령어
명령어 | 단축키 | 설명 |
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 | : | Comment 추가 |
Edit data | Ctrl + E | 데이터 편집 |
Assemble | Space | 어셈블리 코드 작성및 수정 |
3.2 베이스 캠프
- 디버거를 재실행할 때마다 매번 EP 코드부터 새로시작 → 비효율적
- 코드 중간주간에 분석을 원하는 중요 포인트(주소)를 지정하여 그 포이트로 빠르게 이동하여 분석하는게 효율적 →등산에서 베이스 캠프와 같은 역할
● 베이스 캠프 설정법
- Goto 명령어 사용 [Ctrl + G] 후, [F4]명령으로 커서까지 프로그램 실행
- BP 설정 [F2]
- 주석 삽입 [ ; ]
- 레이블 설정 [ : ]
4. 원하는 코드 빨리 찾아내는 4가지 노하우
4.1 코드 실행 방법
- 디버거로 Step over [F8] 을 반복 수행하면서, 분석자가 확인할 수 있는 상황이 나타날 때까지 계속 실행한다.
4.2 문자열 검색 방법
- 프로그램 내에서 사용되는 "문자열"을 확인
- Code Window 에서 [우측마우스] → [seacrh for] → [Current Modules] → [All Referenced text strings]
검색 하려는 문자열을 더블 클릭하거나 Goto 명령어를 사용하여 이동할 수 있다.
4.3 API 검색
- 사용된 API를 검색
- Code Window 에서 [우측마우스] → [seacrh for] → [Current Modules] → [All intermodular calls]
원하는 API 확인후 더블클릭하거나 Goto 명령어로 이동
5. " Hello World!" 문자열 패치
5.1 패치
- 패치 대상 : 파일 or 메모리 / 코드 or 데이터
- 목표 : 메시지 박스의 " Hello World!"를 다른 문자로 변경
5.2 문자열 패치 방법 (1) - 문자열 버퍼를 직접 수정하기
- 덤프 창에서 Goto 명령으로 문자열 주소로 이동
- 마우스로 변경할 메모리 전체 선택
- [Ctrl + E] 명령어를 사용해 문자열 수정
🔴 주의할점!
→ 문자열 입력시 문자열 길이에 주의해야하는데, 유니코드 문자열은 2바이트 NULL로 끝나야한다.
→ 유니코드 항목에는 NULL을 입력할 수 없으므로 HEX 항목에다 NULL을 입력한다.
- 실행
5.2 문자열 패치 방법 (2) - 다른 메모리 영역에 새로운 문자열을 생성하여 전달
- 덤프 창에서 문자열을 저장할 영역 선택( 409F50)
- [Ctrl + E] 명령어로 유니코드에 문자열 저장
- 401007코드창에서 space 바를 누른후 PUSH 409F50 으로 수정
- 실행
'Reverse Engineernig > study' 카테고리의 다른 글
[리버싱 핵심원리] ch05. 스택 (0) | 2022.12.27 |
---|---|
[리버싱 핵심원리] ch04. IA-32 Register 기본 설명 (0) | 2022.12.27 |
[리버싱 핵심원리] ch03. 리틀 엔디언 표기법 (0) | 2022.12.26 |
[리버싱 핵심원리] ch01. 리버싱 스토리 (0) | 2022.12.26 |
[Assembly]어셈블리어 명령어 모음 (0) | 2022.06.08 |