본문 바로가기

강의

[NOOBHACK] 함수 에필로그

오늘은 어셈블리어에서 함수의 끝 작업을 수행하는 에필로그에 대해 알려주겠다

끝 작업은 보통 leave와 ret로 나뉘어 진다 그리고 eip와 esp, ebp 레지스터에 대해 알 필요가 있다

 

ebp: 변수의 기준의 주소를 담고 있는 레지스터다 보통 데이터를 담고 있는 메모리 주소와 코드를 실행 시킬 수 있는 메모리 주소가 나뉘어져 있는데 주소의 기준을 잡아 줘야 변수의 메모리 주소를 알기 편하다

 

esp: 스택의 최단 위치를 결정하는 레지스터다 예를 한번 들어보자

그림과 같이 esp가 buf의 끝을 가리킨다면 stack에는 다음과 같이 표현된다

stack에는 buf까지 보여주고 있다 스택의 최상단 지점은 바로 esp가 정한다고 볼 수 있다

 

eip: 이 레지스터가 가지고 있는 값은 다음에 실행될 코드의 메모리 주소를 담고 있는 레지스터다

 

이제 레지스터를 알았다면 leave와 ret가 수행하는 코드를 한번 살펴보자

 

leave

mov esp, ebp
pop ebp

leave는 두 코드로 나누어 작업을 실행하는데

이 코드를 실행하면서 어떤 과정을 보여주는지 알아보자

 

mov esp, ebp

ebp는 sfp를 가리키고 esp는 buf의 주소를 가리킨다 하지만 mov esp, ebp로 인해 esp는 ebp와 같은 곳을 가리키게 된다

 

 

POP ebp

pop ebp를 수행 하였을 때 ebp는 자신이 담고 있는 메모리 주소로 이동하고 같은 메모리 주소에 있는 esp는 +4byte 되어 

esp는 ret를 가리키고 있다

 

이제 leave 작업을 수행 했으니 이번엔 ret 작업을 수행하겠다 ret의 코드는 다음과 같다

ret

pop eip

jmp eip

 

또 두 코드를 실행하여 보자

 

POP eip

POP eip를 한다면 esp는 +4byte 하게 돼고 eip는 ret를 가리키게 된다

 

JMP eip

이제 ret를 가리킨 eip는 이제 jmp 명령어로 eip가 가리키고 있는 주소로 jmp하게 된다

 

이 함수 에필로그를 왜 배우냐면 개발의 목적과 SFO 취약점을 배우기 위해 필연적으로 배워야 한다

'강의' 카테고리의 다른 글

[NOOBHACK] Reverse engineering techniques and know-how  (0) 2023.10.09
[NOOBHACK] Thread Local Storage이란  (0) 2023.02.02
[NOOBHACK] APT 공격  (0) 2022.10.14
[NOOBHACK] 사회공학기법  (0) 2022.10.14
[NOOBHACK] 디버그(Debug)  (0) 2022.10.11