반응형




안녕들 하시죠 !


오늘은 HelloWolrd.exe 파일을 가지고 리버싱 첫번째 공부를 시작해 보려 합니다.

 

우선 아래 보이는 이미지처럼 Hello World !MessageBox로 출력되는 코드를 하나 작성해주세요.


코드는 아래에 있는 텍스트 파일을 받으시면됩니다.


HelloWorld !.txt





코드를 작성하신 후에 위에있는 이미지의 노란부분을 Release로 바꾸신 후에 빌드를 해주시면 HelloWorld.exe 가 생성됩니다.

( Release 모드로 빌드하면 코드가 더 간결해져서 디버깅하기에 편하다고합니다 ! )

 

HelloWorld.exe가 어디에 있는지 잘 모르시겠다면 윈도우의 검색기능을 통해서 찾아보세요

( 혹은 제 블로그 꿀팁 카테고리에 있는 Search Everything 설치를 봐주세요 ! )

 

, 이제 드디어 Ollydbg로 가봅니다.

Ollydbg를 실행시킨후에, File -> Open 하신 후에 HelloWorld.exe 파일의 경로로 들어가 열어줍니다


그럼 아래와 같은 화면이 나오게 됩니다.




1.     16진수 메모리 주소 창


2.     기계어를 보여주는 창 ( IA32 CPU명령어 )


3.     어셈블리어( OP code를 어셈블리로 변환한 코드 ) ( 왼쪽 ), 주석( 오른쪽 )


4.     레지스터


5.     덤프


6.     스택

 


아래에는 알아둬야할 Ollydbg 기본 명령어





, 그럼 이제 main문을 찾는 것을 목표로 삼고 진행해 보겠습니다.


이제 여기서 실행( F9 )를 누르게 되면 다음과 같은 화면이 나옵니다.




맨위에 2줄을 보면 이런식으로 나타나게됩니다. 이 내용을 해석해보자면


“2F284C 주소의 함수를 CALL한 후 2F104F 주소로 점프(JMP) 해라 라는 뜻입니다.

 

혹시, 주소가 아래와같이 나오신다면 명령어부분(CALL HelloWor.__security_init_cookie) 이부분을 더블클릭 하시면 아래 이미지처럼 주소가 

나옵니다.




, 그럼 F7을 눌러 이 코드안으로 들어가봅시다.




뭔가 알수없는 코드들이 나왔습니다.

여기에서 가장 오른쪽에 빨간글씨가 있는 부분 보이시죠? 이부분이 주석(comment) 부분 입니다.


이 빨간색 글씨로 된 부분은 코드에서 호출되는 API 함수 이름이라고 합니다.

이름만 살펴보게되면 원본 코드에서 사용된적 없는 API들이 호출되고있습니다.

책에 있는 설명을 보면 지금 우리가 들어와있는 이 공간은 Visual C++ 에서 프로그램 실행을 위해 추가시킨 Stub Code 라고 합니다.

 

Stub Code ?


사용자가 추가한 코드가 아닌 컴파일러가 프로그램을 만들때 추가한 코드라고 합니다.

실행 정보를 가져오고 프로그램을 실행하는데 필요한 정보를 얻어오는 코드라고 합니다.

그러니, 우리는 Stub Code를 구분하여 넘기고 Main 함수를 찾는 연습을 해봐야할 것 같습니다.

 

.

스크롤을 아래로 조금만 내려보면 RETN 명령어가 보입니다.



RETN 명령어는 우리가 알던것처럼 함수의 끝에서 사용되며 이 함수를 실행하게되면 다시 원래의 주소쪽으로 되돌아갑니다.

아마 이 Stub Code가 있는 공간을 탈출하는 것 같습니다.

 

, 그럼 RETN 명령어 위치까지 Ctrl + 9로 한방에 가보겠습니다

그리고 F8을 눌러 RETN을 실행하겠습니다.




그럼 처음에 봤던 2F11A6주소로 돌아오게되었습니다.

이제, F8을 눌러 JMP 2F104F 명령을 실행해 보겠습니다.




JMP 2F104F 명령을 실행하고나니 2F104F 주소로 이동하게되었습니다. 이또한 Stub Code라고합니다.

 

그럼 이제부터는 조금 무식한 방법으로 함수호출 명령어를 하나하나 따라가 보며 찾고있는 Main문을 향해 가보는 연습을 해보겠습니다.

 

F7로 들어가서 Stub Code들을 만나면 Ctrl + 9를 눌러 빠져나오고 또 F8삽질에 삽질을 반복 또 반복 하다보니 아래 이미지의 코드를 지나고 나면 MessageBox가 실행이 되는걸 파악했습니다.





F7로 들어가보게되면




찾은 것 같습니다 !

 

2F1000 이라는 주소에 MessageBoxW() API 호출 코드가 있고 PUSH를 통해 MessageBox에 표시될 문자열들을 스택에 저장하는 부분을 보니 맞네요.

 

역시 쉽지가 않네요ㅠㅠ

하지만 직접 해보는 내내 너무 흥미롭고 재밌다는 생각이 들었습니다.

 

다음 글에서는 베이스캠프를 설치하고, 원하는 코드를 빨리 찾아내는 방법을 사용하여 더 능숙하게 다루는 연습을 해보겠습니다.


오늘은 여기까지입니다 감사합니다 !



참고서적 이승원 「리버싱 핵심원리」 인사이트(2018) p13~23

+ Recent posts