본문 바로가기

컴퓨터와 보안/리버싱

Hello world! 리버싱2

저번 포스팅에 이어서 베이스캠프에 관한 내용부터 포스팅을 이어가겠다.

 

베이스캠프를 설치하는 4가지 방법

 

1. Goto 명령

베이스캠프 주소를 잘 기억해 두었다가 Go to[Ctrl+G] 명령으로 가는 것이다.

Go to 명령어를 실행하면 입력한 주소에 커서가 놓여져 있을 텐데, Execute till cursor[F4] 명령으로 그곳까지 실행하면 

커서부터 디버깅을 편하게 진행할 수 있다. (마치 Ctrl+F 명령으로 텍스트에서 글을 찾는것과 같은 방법인 것 같다.)

 

2. BP(Breakpoints) 설치

베이스캠프로 가는 또 다른 방법은 BP(Break Pint)를 설치[F2], 하고 실행[F9]하는 것이다.

가장 편하고 많이 사용되는 방법이라고 한다.

(책갈피 개념이라고 생각하면 될 듯 싶다.)

메인 메뉴의 View - Breakpoints를 선택하면, 그림 2.13과 같이 Breakpoints 목록이 나타난다. 이 목록에서 원하는 Breakpoint를 더블클릭하면, 해당 주소로 간다.

 

3. 주석

[;] 단축키로 주석(Comment)를 달고, 이 주석을 찾아 가는 방법도 있다.

이것도 마찬가지로 책갈피같은 느낌이라 보면 될 거 같다.

 

4. 레이블

레이블은 원하는 주소에 특정 이름을 붙여주는 유용한 기능이다.

단축키 [:]를 이용해 레이블을 입력할 수 있다. 주석과 비슷한 기능이다.

 

 

주석과 레이블 모두 마우스 우클릭 후 위 화면과 같이 Search for 에 들어가 User-defined label User-defined comment에서 확인할 수 있다. 원하는 '주소'로 간 후 디버깅을 시작하는 방법을 알았으니 원하는 '코드' 를 찾아내는 방법도 알아보자.

 

원하는 코드를 빨리 찾아내는 3가지 방법

1. 문자열 검색 방법

마우스 우클릭 후 Search for -> All referenced text strings 으로 들어간다.

프로그램 코드에서 참조되는 문자열이 다 떠버린다. 세상에......

심지어 저 글귀를 클릭하면 해당 주소로 갈 수 있다. 실로 엄청난 방법이다...

 

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

마우스 우클릭 후 Search for -> All intermodular calls 로 넘어간다.

코드에서 사용된 API 호출 목록이 나타난다. 엄청나다. 마찬가지로 더블클릭하면 이동 가능하다.

(어떻게 프로그램에서 호출되는 API의 이름을 정확히 뽑아올 수 있을까? 이 원리를 이해하기 위해서는 

PE File Format의 IAT구조를 이해해야 한다고 한다. 나중에 공부하고 포스팅 하겠다.)

 

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

 

Ollydbg가 모든 실행 파일에 대해 API 함수 호출 목록을 추출할 수 있는 것은 아니다. Packer/Protector를 사용하여 실행 파일을 압축(또는 보호)해버리면, 파일 구조가 변경되어 Ollydbg에서 API 호출 목록이 보이지 않는다.

 

이런 경우에 프로세스 메모리에 로딩된 라이브러리(DLL 코드)에 직접 BP를 걸어 볼 수 있다. 

 

(API란 Application Programing Interface의 약어로, 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합이다. 그리고 API 는 C:\Windows\system32 폴더 내의 *.dll 파일 내부에 구현되어 있다.

우리가 만든 프로그램이 어떤 의미 있는 일을 하려면 반드시 OS에서 제공된 API를 사용해서 OS에게 요청해야 하고, 그 API가 실제 구현된 시스템 DLL 파일들은 우리 프로그램의 프로세스 메모리에 로딩되어야 한다.)

 

 

우선 위의 방법과 같이 Search for -> Name in all modules 로 들어가 name을 클릭하고 MessageBox를 입력해 MessageBoxW를 아래 사진과 같이 찾아 더블클릭으로 이동해준다.

Name in all modules

 

USER32.dll에 구현된 실제 MessageBoxW 함수

위의 사진과 같이 실제 MessageBoxW함수가 나타난다. 이곳에 BP를 설치하고 실행한다. 그럼 MessageBoxW코드 시작에 설치한 BP에서 실행이 멈춘다. 이때 스택 윈도우 화면창을 보면 아래와 같이 리턴 MessageBoxW의 함수 실행이 종료되었을 때 리턴 주소값을 알 수 있다.(00401014)

Stack window 화면

그냥 이 리턴주소값을 [Ctrl+G] 커맨더를 입력해서 찾을 수 있다.

 

 

이제 원하는 코드를 빨리 찾아가는 방법에 대해 알았으니 "Hello World!" 문자열을 패치시켜 볼 차례다.

다음 포스팅에 이어 작성하겠다.

'컴퓨터와 보안 > 리버싱' 카테고리의 다른 글

PE File Format3  (0) 2021.04.01
PE File Format  (0) 2021.03.29
Hello World! 리버싱3  (0) 2021.03.28
Hello World! 리버싱  (0) 2021.03.28
리버싱 핵심 원리  (0) 2021.03.28