본문 바로가기
Reversing/리버싱 핵심 원리

[리버싱 핵심 원리] 2장, Hello World! 리버싱

by Y06 2020. 9. 14.

02. Hello World! 리버싱

 

1. Hello World.exe

1.1 Hello World.exe

1) 소스코드 및 실행 화면

1.2 디버거와 어셈블리 언어

1.2.1. 프로그램 처리 과정

소스코드(.cpp) -> 실행파일(.exe) -> 디버거 유틸리티 -> 어셈블리 언어

 

1) 실행 파일에 작성된 기계어는 사람이 알아보기 어렵기 때문에 좀 더 편하게 보기 위해서 디버거 유틸리티 사용

2) 디버거에 탑재된 디스 어셈블러 모듈은 이 기계어를 어셈블리 언어로 변역해서 보여줌

 

2. HelloWorld.exe 디버깅

2.2 OllyDbug

 

직관적인 인터페이스와 강렬한 확장 기능으로 무장한 Win32 디버거

설치: www.ollydbg.de/

 

1) Code Window : 기본적으로 disassembly code를 표시하여 각종 comment, label을 보여주며, 코드를 분석하여 loop, jump 위치 등의 정보를 표시

2) Register Window : CPU Register 값을 실시간으로 표시하여 특정 register들은 수정도 가능

3) Dump Window : 프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정 가능

4) Stack Window : ESP register가 가르키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능

 

2.2.3.EP

 

디버거가 멈춘 코드는 EP코드로 Hello World의 실행 시작 주소이다.

1) Address: 프로세스의 가상 메모리 내의 주소

2) Instruction: IA32 CPU 명령어

3) Disassembked code: OP code를 보기 쉽게 어셈블리로 변환한 코드

4) comment: 디버거에서 추가한 주석

 

2.2.4. 실행 시작 함수 따라가기

명령어 단축키 설명
Restart [Ctrl+F2] 다시 처음부터 디버깅 시작
(디버깅 당하는 프로세스 종료 후, 재실행)
Step Into [F7] 하나의 OP code 실행
(CALL 명령을 만나면, 그 함수 코드 내부로 따라 들어감)
Step Over [F8] 하나의 OP code 실행
(CALL 명령을 만나면, 따라 들어가지 않고 그냥 함수 자체를 실행)
Excute till Return [Ctrl+F8] 함수 코드 내에서 RERN 명령어까지 실행
(함수 탈출 목적)

 

2.3.2. 베이스 캠프

디버깅을 진행하면서 중간중간 코드에서 분석을 원하는 중요 포인트(주소)를 지정해 놓은 후 그 포인트로 빠르게 갈 수 있는 방법

 

1) goto 명령

2) BP 설치

3) 주석

4) 레이블: 원하는 주소에 특정 이름을 붙여주는 기능

 

책과 같이 일명 노다가를 뛰며 찾는 방법도 있지만 2.4의 원하는 코드 빨리 찾아내는 4가지 방법을 통해서 우리가 원하는 main() 함수를 찾아가겠다.

 

2.4.원하는 코드 빨리 찾아내는 4가지 방법

2.4.1. 코드 실행 방법

이 경우는 코드의 크기가 작고 기능이 명확한 경우에 사용할 수 있다.

 

2.4.2.문자열 검색 방법

마우스 우측 메뉴 - Search for - All referenced text strings

 

004F0E80의 주소를 Dumo window에 [Ctrl+G]를 이용하여 검색하면 아래와 같이 hello world!를 찾을 수 있다.

2.4.3.API 검색 방법 (1) - 호출 코드에 BP

마우스 우측 메뉴 - Search for - All intermodular calls

MessageBoxW() 호출 코드를 확인할 수 있다. 4534F8 주소에서 user32.MessageBox() API를 호출하고 있다.

 

2.4.4.API 검색 방법 (2) - API 코드에 직접 BP

MessageBoxW() 함수를 선책하면 구현된 실제 MessageBoxW 함수가 보인다.

주소를 보면 HelloWorld.exe에서 사용되는 주소와 확연히 틀리다는 걸 알 수 있다. 이곳에 BP를 설치하고 실행(F9)하면 아래와 같은 결과를 볼 수 있다.

2.5."Hello World!" 문자열 패치

2.5.1.패치

 

1. 문자열 버퍼를 직접 수정

 

유니코드 문자열은 2바이트 크기의 NULL로 끝나야 한다.

 

2. 다른 메모리 영역에 새로운 문자열을 생성하여 전달

 

이 방법은 파일을 생성하는 방법이다. 책에 나와있는 내용을 따라가다 보면 쉽게 할 수 있다.