ii4gsp

[Reversing] Hello World 본문

리버싱

[Reversing] Hello World

ii4gsp 2020. 8. 18. 14:45

HelloWorld.exe
0.78MB

#include "windows.h"
#include "tchar.h"

int _tmain(int argc, TCHAR *argv[])
{
	MessageBox(NULL, 
	    L"Hello World!", 
	    L"Reverse", 
	    MB_OK);
	
	return 0;
}

HelloWorld.exe 프로그램의 소스코드는 이러하다.

프로그램을 디버깅 하기전에 정적분석을 통해 프로그램을 분석해보자.

 

 

 

 

프로그램 실행시 Hello World! 라는 메세지를 출력해주는 메세지 박스가 뜨고 확인을 누르면 프로그램이 종료가 된다.

아주 간단한 프로그램이니 정적분석은 이정도로 충분하다.

바로 동적분석을 해보자.

 

 

 

 

Immunity Debugger로 프로그램을 열어보면 4가지의 기본 화면이 나온다.

 

Code : 기본적으로 disassembly code를 표시해주고 주석, 레이블을 보여준다.

Register : CPU의 register 값을 실시간으로 보여주고 register를 수정할 수 있다.

Dump : 프로세스의 memory 주소 위치를 Hex와 아스키코드/유니코드 형태로 보여주고 수정할 수 있다.

Stack : ESP register가 가리키는 프로세스 stack memory를 실시간으로 보여주고 수정할 수 있다.

 

 

 

 

Code 부분을 보면 (1)은 Address, (2)는 Instruction, (3)은 Disassembled, (4)는 Comment 이다.

Address 부분을 보면 현재 디버거는 0x44D1D5 부분에서 멈춰있다.

디버거가 멈춘 곳은 EP(Entry Point) 코드로 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작 위치라고 생각하면 된다.

 

단축키

[Ctrl+F2] : 프로그램 재시작

[F7] 코드 한줄을 실행한다.(CALL 명령을 만나면, 함수 내부로 이동)

[F8] 코드 한줄을 실행한다.(CALL 명령을 만나면, 함수 내부로 이동하지않고 함수만 실행)

[Ctrl+F9] : 함수 코드 내에서 RETN 명령어까지 실행

 

 

 

 

노가다로 main() 함수 찾기

 

EP 코드에서 코드를 한 줄 실행하면 0x452C60 주소로 JUMP를 하게된다.

main() 함수가 아니기 때문에 단축키 F7를 이용해 CALL 0x4528E0 명령어의 0x4528E0 함수 내부로 이동해보자.

 

 

 

 

이 부분도 main()함수가 아니기 때문에 CALL 명령을 하는 함수 내부로 들어가주자

 

 

 

 

0x44E64D 내부에는 0x453ED0 주소로 JUMP를 한다.

 

 

 

 

0x453ED0로 JUMP를 해보면 아주많은 어셈블리어가 보이는데 이것또한 main()함수가 아닌 Stub Code 이다.

Stub Code란 사용자가 코딩한 코드가 아니라 컴파일러가 임의로 추가시킨 코드이다.

Stub Code까지 분석할 필요는 없다.

 

 

 

 

0x44E64D 함수가 종료되고 다시 0x452900 함수 내부로 들어가보자.

 

 

 

 

이것또한 Stub Code 이므로 0x44D05E 함수 내부로 들어가주자.

0x44D05E 내부에는 사진 업로드는 안했지만 0x453990의 주소로 JUMP 한다.

 

 

 

 

코드를 한줄씩 실행하며 0x44C1A9 함수 내부로 이동하면 0x455030 주소로 JUMP를 한다.

 

 

 

 

똑같이 호출하는 함수 내부로 들어가주자

 

 

 

 

F7을 통해 코드를 하나씩 실행하니 Address가 0x455XXX가 아닌 0x754B0XXX로 바뀌었다.

이것은 API 함수의 내부로 들어왔기 때문이다.

계속해서 함수 내부로 이동하여 보자.

 

 

 

 

이전에 C++로 작성한 코드에서 보이는 MessageBox() 함수와 "Reverse", "Hello World!" 문자열이 보인다.

 

 

 

 

즉, MessageBox() 함수를 포함하는 PUSH EBP ~ RETN 까지 main() 함수이다.

MessageBox() 함수를 호출해보자.

 

 

 

 

정상적으로 MessageBox() 함수가 호출된걸 볼 수 있다.

 

 

 

 

문자열을 통해 main() 함수 찾기

 

[Ctrl+F2]를 이용해 프로그램을 재실행 해주자.

우리는 정적분석을 통하여 "Hello World" 문자열이 출력된다는 정보를 알고있다.

 

 

 

 

마우스 우클릭 -> Search for -> All referenced text strings 메뉴를 클릭해주자.

 

 

 

 

위쪽에 "Reverse", "Hello World" 문자열이 보인다.

더블클릭을하면 문자열이있는 주소로 이동한다.

 

 

 

 

아까 보았던 MessageBox() 함수를 호출하는 부분이 보인다.

이렇게 간단하고 빠르게 main() 함수를 찾을수있다.

 

 

 

 

함수를 통해 main() 함수 찾기

 

프로그램 재시작 후

마우스 우클릭 -> Search for -> All intermodular calls 메뉴를 클릭해주자.

 

 

 

 

프로그램에서 포함하는 함수들의 정보를 보여주는곳이다.

2번째에 있는 MessageBox() 함수를 더블클릭 해주자.

 

 

 

 

MessageBox() 함수와 함수의 인자로 "Reverse", "Hello World"가 보인다.

즉, main() 함수로 이동한것이다. 

'리버싱' 카테고리의 다른 글

[Reversing] Hello World 문자열 패치  (0) 2020.08.20
리버싱 (Reversing) 예제  (0) 2020.01.07
FSC_Level1  (0) 2020.01.06
Comments