레지스터
CPU에서 사용하는 고속 기억장치
인텔 x86 CPU의 기본 구조인 IA - 32 아키텍처의 경우, 9개의 범용 레지스터를 제공합니다.
- EAX
- EBX
- ECX
- EDX
- ESI
- EDI
- EBP
- ESP
- EIP
프로그램에서 사용하는 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP 레지스터와 운영체제에서 제공하는 EIP 레지스터가 있습니다.
EAX
연산에 사용되는 레지스터, 함수의 반환값도 저장함
EBX
ESI나 EDI와 결합해 인덱스에 사용
ECX
반복 횟수 저장
EDX
EAX와 같이 사용되며 부호 확장 명령 등에 활용됨
ESI
데이터 복사 및 조작할 때 소스 데이터 주소가 저장됨
ESI 레지스터가 가리키는 주소에 있는 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용
EDI
복사 작업 시 목적지 주소가 저장되는 레지스터
EBP
하나의 스택 프레임의 시작 주소가 저작됨
현재 사용되는 스택 프레임이 살아있는 동안 -> EBP의 값은 변하지 X
현재 사용한 스택 프레임이 사라질 경우? 이전에 사용되던 스택 프레임을 가리키게 됨
ESP
하나의 스택 프레임의 끝 지점 주소 저장
PUSH, POP 명령어에 따라 ESP 값이 4바이트 씩 바뀜
EIP
다음에 실행할 명령어가 저장된 메모리 주소가 저장되는 레지스터
현재 명령어를 모두 실행한 후, EIP 레지스터에 저장된 주소에 있는 명령어를 실행하게 됨
스택
간단히 말해, 스택은 메모리의 한 부분입니다.
스택은 LIFO 방식으로 동작하는 자료구조인데, LIFO란 가장 마지막에 들어간 데이터가 가장 처음에 나온다는 것을 의미하는 말로서 스택은 가장 마지막에 들어간 데이터를 가장 처음에 나오게 하는 구조를 가졌다는 걸 의미합니다.
● POP
ESP + 4 BYTE
ESP는 스택의 가장 끝 주소를 가리키는 레지스터이고, 스택은 메모리 구조에서 스택이 차지하는 모습을 보면 알겠지만
ESP가 가리키는 게 스택의 끝 주소를 가리킨다는 걸 생각하면, POP을 하면 오히려 스택이 아래로 줄어듦으로 인해 ESP가 가리키는 주소값이 커지는 것을 확인할 수 있습니다.
그럼 반대로 PUSH의 경우에는?
● PUSH
ESP - 4 BYTE
ESP가 가리키는 값(주소값)이 줄어든 것을 확인할 수 있습니다.
스택은 시작 주소에서 주소가 작아지는 방향으로 데이터가 쌓입니다.
프로그램에서 스택은 서브루틴으로 인자를 전달하고, 서브루틴 내부에서 사용하는 지역변수가 저장되는 공간을 제공하며, 서브루틴이 종료될 때 되돌아갈 주소도 저장하는 역할을 합니다.
스택 프레임
서브루틴(함수)이 가지는 자신만의 스택 영역을 의미합니다.
스택 프레임에는 서브루틴(함수) 내부에서 사용하는 데이터가 저장됩니다. 함수가 호출될 때, 스택 프레임이 생성되며 함수가 동작을 종료하고 복귀 주소로 돌아가면 스택 프레임은 소멸됩니다.
서브루틴을 호출할 때 필요한 인자들을 먼저 스택에 입력하고, 서브루틴을 실행하기 바로 직전 운영체제는 다시 돌아올 주소인 복귀 주소(Return Address)를 스택으로 집어넣습니다.
스택 프레임이 시작되게 되면 이전 루틴에서 사용했던 EBP 레지스터 내용을 백업하고, 해당 레지스터가 백업된 위치의 스택 주소를 서브루틴의 EBP에 다시 집어넣습니다. 이렇게 설정된 EBP는 스택 프레임에서 데이터 참조를 위한 기준 주소인 프레임 포인터로 사용됩니다.
스택에 있는 데이터를 접근할 때 프레임 포인터를 사용하는 이유?
ESP 레지스터는 프로그램을 실행하면서 계속 변합니다. (ex> PUSH, POP을 하게 되면 계속 4바이트 씩 바뀜)
그렇기에 변하지 않는 EBP를 사용해서 스택에 있는 데이터에 접근하려는 것....!😀
References
https://icarus.cs.weber.edu/~dab/cs1410/textbook/4.Pointers/memory.html
'보안 > Reversing' 카테고리의 다른 글
[Dreamhack] please, please, please (0) | 2025.01.02 |
---|---|
[Dreamhack] Recover (1) | 2024.12.27 |
[Dreamhack] legacyopt (0) | 2024.11.25 |
[Cracking] ELF x86 - 0 protection (0) | 2024.11.18 |
abex - crackme 3 (2) | 2024.09.09 |