Stack?
- 메모리의 일부분으로 LIFO(Last Input First Output) 방식으로 동작하는 자료 구조.
스택은 PUSH 와 POP 이라는 동작을 지원하는데,
PUSH는 데이터를 스택에 넣는 명령어를 뜻하고, POP은 데이터를 스택에서 꺼내는 명령어입니다.
보통 데이터가 들어가면 들어갈수록 데이터의 주소가 증가한다고 착각하기 쉬운데,
스택은 데이터가 들어가면 들어갈수록 데이터의 주소가 감소합니다.
따라서 PUSH를 하면 스택의 주소는 4바이트만큼 감소하면서 데이터는 스택에 쌓이고,
POP을 하면 스택의 주소는 4바이트만큼 증가하면서 데이터가 꺼내집니다.
스택에 데이터가 들어갈수록 주소값이 작아지게 설계된 이유는
스택 구조 위에 있는 데이터가 Kernel과 관련이 있기 때문에 그렇습니다. 운영체제와 연관된 부분이기 때문에
사용자가 함부로 그 영역을 침범하면 시스템에 치명적인 영향을 끼치게 되겠죠.
그래서 아래로 자라나는 고드름 형태로 스택이 설계가 된 것입니다.
현재 프로그램이 사용하는 스택의 위치는 ESP 레지스터에 저장됩니다.
ESP 레지스터가 무엇인지 잘 모르신다면 이전 포스팅의 글을 참고하시면 될 것 같습니다.
https://ffoorreeuunn.tistory.com/57
스택에 데이터를 PUSH하면 ESP 레지스터의 값이 4만큼 줄어들고,
POP하면 ESP 레지스터의 값이 4만큼 증가하는 것을 확인할 수 있습니다.
나중에 올리디버거를 이용해서 실습할 때 보여드리겠습니다!
스택은 서브함수로 인자를 전달하고, 지역변수가 저장되는 영역을 제공하고,
서브함수가 종료되었을 때 돌아갈 주소를 저장하는 역할을 담당합니다.
Stack Frame?
- 서브함수가 가지는 스택 영역. 서브함수에서 사용되는 지역변수 등이 저장됨.
스택 프레임은 함수가 호출될 때 생성됩니다. 물론 함수가 종료될 경우 사라지게 되겠죠.
스택 프레임이 생성되기 전에 서브함수에 필요한 인자들이 먼저 스택에 저장됩니다. 그리고 서브함수가 종료될 때
되돌아올 주소를 저장하고, 스택프레임이 생성됩니다.
스택프레임에서 빠질 수 없는 레지스터가 있습니다.
바로 EBP(Extended Base Pointer) 입니다.
EBP는 스택프레임의 시작을 알리는 포인터 입니다. EBP 가 가리키는 공간에는 자신을 호출한 함수의 주소를
담고 있는 메모리 번지수가 저장되어 있습니다.
설정된 EBP는 스택 프레임 내에서 데이터를 참조하기 위한 기준이 되어 프레임 포인터라고 불리기도 합니다.
스택이 어떤 식으로 설계되었고, 스택의 원리가 대략 어떤 것인지 모르고 리버싱을 공부한다면
습득하는 지식에 한계가 있을 것입니다.
다음 포스팅은 리버싱공부할 때 많은 사람들이 어려워한다는 PE 파일을 주제로 .포스팅하도록 하겠습니다.
리버싱을 처음 접하고 공부하고 있는지라 부족함이 많습니다.
틀린 부분 지적은 댓글로 해주시면 감사하겠습니다.
'Archive > Hacking' 카테고리의 다른 글
[카카오 100일 보안뉴스 한줄 요약] 블루투스 취약점, 블러투스 (0) | 2020.09.11 |
---|---|
[ Linux 명령어 ] Linux command & Multi - command | 리눅스 파이프와 세미콜론 차이 (0) | 2020.07.13 |
[ Register ] 범용 레지스터 종류 & 범용 레지스터 역할 (0) | 2020.04.19 |
[ Pwnable ] pwnable.kr 1번 fd 풀이 (2) | 2020.04.15 |
[ Assemble ] 어셈블리 곱셈(mul)/ 나눗셈(div) 연산 실습(1byte) (0) | 2020.04.15 |