본문 바로가기

Computer Engineering/System

[System Security] push ebp / mov ebp,esp

   0x08048420 <+0>: push   ebp
   0x08048421 <+1>: mov    ebp,esp
=> passwd.test 를 DeskTop 에서 gdb 로 읽어들인 결과 상위 두 줄에도 역시 push ebp 를 확인할 수 있다.

이전에 ebp, esp 가 뭐냐고 물어 보신다면 여기로 가셔서 해당 용어를 한 번 읽어보고 오시면 좋을 것 같습니다.

클릭이 귀찮은 분들을 위해 ebp, esp 만 간략하게 이야기 하자면
EBP (Extended Base Pointer)
 -  현재 스택에 가장 바닥을 가리키는 포인터 (함수 내에서 스택상에 저장된 값을 참조할 때 기준)
 -  새로운 함수가 호출될 때마다 EBP 레지스터 값이 지금까지 사용했던 스택 꼭대기의 위에 위치하게 되고 새로운 Stack이 시작  
-  따라서 EBP는 새로운 함수가 호출이거나 현재 실행중인 함수가 종료되어 리턴될 때마다 값이 달라짐
 
 

ESP (Extended Stack Pointer)
 -  현재 스택의 가장 위에 들어있는 데이터를 가리키고 있는 포인터
 -  Intel CPU에서는 스택이 거꾸로(리틀엔디언)  자라므로 데이터가 하나 PUSH 될때마다 ESP 값은 감소
 -  ESP는 다음 번 DATA를 Push 할 위치가 아니라 다음에 POP 했을 때 뽑아낼 데이터의 위치를 가리 킴   

push ebp ? EBP 를 Stakc 에 쌓는다. 기존의 ebp 레지스터를 저장하는 것이다.  
//이전 Stack의 Base 주소를 저장
 
mov ebp, esp ? ESP 레지스터를 EBP 레지스터로 mov 함으로써 새로운 Base 를 설정하는 것이다.
//현재 Stack의 꼭대기를 새로운 스택의 Base 로 설정(새로운 Stack 시작) 


push ebp
mov ebp, esp ?

=> 이 두 줄을 합쳐서 보면 
(x86 환경에서) 새로운 함수를 호출하면 기존의 EBP 레지스터를 저장하고
ESP 레지스터를 EBP 레지스터로 mov함으로써 새로운 base를 설정하게 되는 것이다.

(**참고**) 
- 함수를 새로 호출하게 되면 새로운 기준점을 설정하고 이전의 기준점은 저장해야 한다. 
이전의 기준점을 저장해야 새로 호출된 함수를 종료하고 상위로 돌아갔을 때 다시기준점을 찾을 수 있다. 
- ESP는 항상 스택의 최고점(주소값은 제일 낮은)을 가리키고 있다. 그 상황에서 esp보다 낮은 주소값에 있는스택상의 데이터들은 전혀 의미가 없다(정상적인 흐름에서)

'Computer Engineering > System' 카테고리의 다른 글

[ESPC2] 0x04 Return Address  (0) 2011.12.19
[펌글] CPU Register(레지스터) 32bit  (0) 2011.12.18
[ESPC2] 0x03  (0) 2011.12.17
[ESPC2] 0x02  (0) 2011.12.16
[ESPC2] 0x01  (0) 2011.12.14