본문 바로가기
[보안 Archive] ~2017/리버싱 핵심 원리

[1주] 1장~2장

by Joy L. 2015. 3. 9.
반응형

리버싱 핵심 원리

                              [1주]




1장 - 리버싱 스토리


(1장은 디테일한 정리는 skip하겠다)


* 리버스 엔지니어링이란?

* 분석 방법

-정적 분석

-동적 분석

* Source Code, Hex Code, Assembly Code

* 패치와 크랙




2장 - Hello World! 리버싱


2장에서는 HelloWorld.exe를 실행 했을때 팝업에 나타나는 "Hello World!" 문자열을 "Hello Reversing!" 이라고 바꾸는 실습을 한다. (OllyDbg 이용)


실습을 하기 전에 알아야 하는 부분 :







출력되는 문자열을 바꾸기 위해서 먼저 main 함수를 찾아야한다.


※ 원본 소스코드에서 사용된적 없는 API들이 호출되면 main() 함수가 아니라는것을 알수있다.

예를 들어 Hello world! 팝업이 뜨는 프로그램은 MessageBox() API 호출을 이용한다. 그렇기 때문에 MessageBox() API 가 없는 코드는 메인함수가 아니라는것을 알수 있다.



원하는 코드를 빨리 찾기위한 4가지 방법:


1.     코드 실행 방법

A.     명령어를 하나하나 실행하면서 원하는 위치를 찾아가는거.

B.      코드의 크기가 작고 기능의 명확할 때 사용 (코드가 크고 복잡할 경우, 부적합)


2.     문자열 검색 방법

A.     ‘All referenced text strings’ 명령 사용. 코드에서 사용되는 문자열들을 볼수있음.


3.     API 검색 방법(1) – 호출 코드에 BP

A.     프로그램의 기능을 보고 사용되었을 법한 Win32 API 호출을 예상하여 찾는다.

B.      Mouse right click – Search for – All modular calls (사용되는 API 함수 목록 뽑아냄)


4.     API 검색 방법(2) – API 코드에 직접 BP

A.     Packer/Protector를 사용하여 실행 파일을 압축(또는 보호)해버리면, 파일 구조가 변경되어 API 호출 목록이 보이지 않음.

B.      이럴때는 프로세스 메모리에 로딩된 라이브러리(DLL 코드)에 직접 BP를 건다. (APIdll파일 내부에 구현되어있다.)

C.      Mouse right click – Search for – Name in all modules

D.     원하는 함수를 선택한다. 그러면 USER32.dll에 구현된 실제 함수가 나타난다.

E.      거기에 BP를 설치하고 실행해본다

F.      BP에서 멈췄을때, (레지스터 창의 ESP = 프로세스 스택의 주소),
(ESP
의 값에 있는 리턴주소=BP건 함수의 호출 바로 다음의 코드). 이 주소의 바로 위에 우리가 BP건 함수 호출 코드가 있다.



main함수를 찾았으면 문자열을 패치해야한다.



문자열을 패치하는 2가지 방법 :


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

A.     덤프 창에서 Go to 명령으로 수정하고 싶은 문자열의 주소로 간다. 그 주소를 마우스로 선택하고 Ctrl+E Edit 창을 띄운다.

B.      단점 : 기존 문자열 버퍼 크기 이상의 문자는 입력하기 어렵다

C.     파일로 생성하기( 이렇게 패치한 내용은 디버거가 종료되면 사라진다. 영구적으로 보존할라면 실행파일로 저장해야함.)

D.     Dump 창에서 병경한 부분을 선택하여 mouse right click 을 하고, copy to executable file 을 선택하면 hex창이 나타난다. 다시한번 mouse right click -> save file


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

A.     기존 문자열 버퍼 크기보다 더 긴 문자열을 입력할 때 사용.

B.      디버거를 재실행한다. [Ctrl+F2] -> main 함수로 이동

C.      main 함수에서 출력되는 문자열은 파라미터로 전달된다. (입력된 주소의 문자열이 출력된다) 그래서 문자열 주소를 변경하면, 변경된 주소에 있는 문자열이 출력된다. (적당한 곳에 긴 문자열을 적고, 그 주소를 파라미터로 넘겨주면 된다.)




반응형

댓글