본문 바로가기

0x00 /0x01 Reversing

- 간단한 실행 파일 디버깅하기 (문자열패치)

# C++로 작성한 간단한 프로그램 디버깅 하기

 

① HelloWorld.exe 파일을 디버깅하여, 메시지 박스에 뜨는 문자열을 패치하는 실습.

 

 

 

[ 그림 1 ] 메시지 박스를 띄우는 간단한 C++ 코드

- C++을 이용하여 간단한 프로그램을 하나 생성한다.

 

 

 

 

[ 그림 2 ] OllyDbg를 이용하여 HelloWorld.exe 파일을 불러온 모습

- 문자열을 패치하기 위해서는 문자열이 존재하는 메인 함수를 우선적으로 찾아야한다.

- 메인 함수를 좀 더 쉽게 찾기 위해서 메인 함수에서 사용되었던 MessageBox API라던가, 문자열을 참조하면 쉽게

  메인 함수를 찾아갈 수 있다.

 

 


 

[ 그림 3 ] 문자열 검색 방법으로 메인함수를 찾은 경우

- 문자열 검색 방법을 이용하여 C++에서 작성된 문자열을 확인하여 메인 함수를 찾을 수 있었다. 

- 제일 앞에 주소 00401002 에 PUSH OFFSET 00409278  이란 명령어가 존재하는 것을 확인할 수 있다. 

   첫 번째 줄을 더블클릭하여 그 주소로 가보자.

 

 


 

[ 그림 4 ] 문자열 검색 방법으로 메인 함수에 접근

- 00401000 부터가 메인함수라는 것을 확인할 수 있다. 

- 0040100E 에서는 MessageBox API 함수를 콜하는 것 또한 확인할 수 있다.

 

* 참고 : 위의 방법 처럼 메인 함수를 찾을 수도 있고, 다른 방법으로는 처음 시작하는 EP에서 [F8]을 이용하여 계속 진행하여 

           프로그램의 특정 동작이 발생하는지 여부를 확인하는 방법도 있다. 위의 프로그램을 예로들면, 어셈블리어를 계속 따라가다가

           메시지 박스가 떳을때, 그 직전 호출되는 함수가 바로 메인 함수가 되는 것이다.

 

 

 


[ 그림 5 ] 문자열 패치하기

- 문자열을 패치하는 방법은 2가지가 있다. 위의 방법처럼 메모리 영역에서 직접 값을 바꿔주는 방법과 새로운 문자열을 메모리 영역에 

   삽입하여, 00401007 의 PUSH 하는 주소값을 바꿔주는 방법이다. 

   (현재 004092A0 이라는 메모리 영역에는 "Hello World!" 라는 문자열이 존재)


- 일단 위에서는 메모리 영역을 직접 바꿔주었는데 이때는 기존의 문자열의 크기보다 더 크게 데이터를 입력하면 뒤의 데이터가 훼손될 수 

  있으므로, 문자열의 크기를 주의해서 수정해야한다. (참고로 유니코드는 알파벳 한 글자당 2바이트)

 

 

 


[ 그림 6 ] 수정 후 실행 결과

- 메시지 박스의 문자열이 변경된것을 확인 할 수 있다.




# 참고 도서 : 리버싱 핵심원리