본문 바로가기

Reversing

[리버스 엔지니어링] 스택, 스택프레임

Stack(스택)
메모리의 영역중 하나로써 후입 선출(Last In First Out)의 구조를 가지고 있다.

함수의 호출과 관련있는 지역 변수(Local Variable), 매개변수(Parameter), 복귀 주소(Return address)가 저장되는 영역이다.

스택 영역은 함수의 호출과 동시에 할당되며, 함수의 호출이 완료되면 없어진다.

PUSH 명령으로 스택에 값을 추가하고 POP 명령으로 스택에 값을 제거한다.

스택에 맨 윗부분을 TOP 또는 SP(Stack Pointer)라고 부른다.

스택은 높은 주소에서 낮은 주소로 메모리를 사용한다.

스택에 값을 집어넣을때(PUSH) 4바이트 감소하고 스택에서 값을 뺄때(POP) 4바이트 증가한다.

Stack Frame(스택 프레임)
ESP 레지스터 대신 EBP 레지스터를 사용해서, 스택 내의 지역 변수, 매개변수, 복귀 주소에 접근하는 방법이다.

ESP 레지스터 값은 프로그램 내에서 가변적이여서, CPU가 정확한 위치를 참고함에 어려움이 있다. 그래서 함수에 시작인 ESP 값을 먼저 스택에 넣고 EBP에 ESP 값을 저장하므로 아무리 ESP 값이 바뀌어도 EBP를 이용해 안전하게 해당 함수의 매개변수, 복귀주소에 접근 가능하게 된다.

crackme1의 메인함수 시작과 끝