본문 바로가기

정보보안/리버싱

reverse_assembly 지역변수&전역변수

13_어셈블리(지역변수&전역변수)

 

 - 분석 환경 : WindowsXP(32bit)

 - 분석 도구 : OllyDbg, VS2008

 

 

1. 지역 변수

 

 - 해당 함수 내에서 사용하는 변수이며, 함수 처리가 완료되면 소멸된다.

 - 함수 안에서 지역 변수를 선언하면, 스택에 SUB 명령어를 이용하여 공간을 확보한다.

 - 이때, 확보되는 공간 크기는 자료형 타입과 선언된 지역 변수 개수에 따라서 다르다.

 - 지역 변수는 스택에 저장되기 때문에 올리디버거에서 'SS'로 출력된다.

 

 

지역 변수 구문은 다음과 같다.

 

int main()

{

           자료형 변수명;

}

 

 

2. 지역 변수 이해

 

 1) VS 2008을 이용하여 'lv.exe' 파일을 제작한다.

 

 - 파일 -> 새로 만들기 -> 프로젝트 -> 빈 프로젝트 -> 위치(04_테스트) & 이름(lv) -> 확인

 - '소스 파일' 우클릭 -> 추가 -> 새 항목 -> 'C++ 파일(.cpp)' 선택 -> 이름(lv) -> 추가

#include <stdio.h>

 

int main()

{

           int num1 = 6;    

           int num2 = 2;

           return 0;

}

 - 파일 -> 모두 저장 -> 닫기

 

 2) 'cl' 명령어를 이용한 최적화 컴파일 실시

 

 

 

3. 올리디버거를 이용한 'lv.exe' 분석

 

 - 메모리 주소, 레지스터 저장 값, 스택 내용, 메모리 덤프 내용 확인

 

1)    main 함수 찾기(F8)

main함수를 call하기 직전의 모습이다. main함수 (00401000)

 

2)    main함수 진입(F7) 후 BreakPoint(F2)

3)    main 함수 프롤로그, 함수 본체, 함수 에필로그 확인(F8)

4)    SUB를 이용한 지역 변수를 위한 공간 확보 내용 확인(F8)

00401003  |.  83EC 08                SUB ESP,8

EBP위로 공간 8byte가 확보된것을 볼 수 있다.

5)    MOV를 이용한 지역 변수값 스택에 대입하는 내용 확인(F8)

 

00401006  |.  C745 F8 06000000       MOV DWORD PTR SS:[EBP-8],6

0040100D  |.  C745 FC 02000000       MOV DWORD PTR SS:[EBP-4],2

-----------------------------------------------------------------------------------------

@ 전역 변수

 

1. 전역 변수

 

 - 다른 함수에서도 사용할 수 있는 변수를 의미하며 프로그램이 종료되면 소멸된다.

 - 전역 변수는 데이터 영역에 저장되어 있기 때문에 스택에 별도의 공간을 확보하지 않는다.

 - 올리디버거에서는 해당 값들이 저장될 위치 주소 앞에 'DS'로 출력된다.

 - 전역 변수 구문는 다음과 같다.

 

자료형 변수명;

 

int main()

{

           전역 변수명;

}

 

 

2. 전역 변수 이해

 

1)    VS 2008을 이용하여 'gv.exe' 파일을 제작한다.

 

 

 - 파일 -> 새로 만들기 -> 프로젝트 -> 빈 프로젝트 -> 위치(04_테스트) & 이름(gv) -> 확인

 - '소스 파일' 우클릭 -> 추가 -> 새 항목 -> 'C++ 파일(.cpp)' 선택 -> 이름(gv) -> 추가

 

#include <stdio.h> &nbsp; int num1; int num2; &nbsp; int main() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num1 = 6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num2 = 2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; }

 - 파일 -> 모두 저장 -> 닫기

1)    'cl' 명령어를 이용한 최적화 컴파일 실시

 

3. 올리디버거를 이용한 'gv.exe' 분석

- 메모리 주소, 레지스터 저장 값, 스택 내용, 메모리 덤프 내용 확인

 

1) main함수 찾기

2) main함수 진입

전역 변수는 데이터영역에 저장됨으로 스택에 별도의 공간을 확보하지 않는다. 따라서, 위의 지역 변수와 다르게 전역 변수의 main함수에서는 SUB를 통한 공간 확보 명령이 존재하지 않음을 확인할 수 있다.

올리디버거를 통해 확인해보면, 해당 값들이 저장될 주소 앞에 DS, 즉 Data Segment 이라 출력된 것을 확인할 수 있으며, 명령 실행 후, 메모리 창을 통해 확인해보면 해당 주소에 값이 입력된 것을 다음과 같이 확인할 수 있다.