P4C 6주차 스택 문서 정리

910·2022년 6월 5일

Stack

  • 메모리의 스택 영역은 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값등의 임시데이터를 저장

  • 선입후출(Last In First Out)

  • 밑에서 위로 데이터가 쌓이는 구조

  • 함수가 실행될 때 할당되고, 함수가 끝날 때 해제되는 지역변수의 특성을 구현하기 적합한 방식


push rbp ; rbp 레지스터의 값을 스택에 push
mov rbp, rsp ; rsp 레지스터의 값을 rbp에 대입
sub rsp, 0x10 ; rsp의 값을 0x10만큼 감소	

leave는 아래 명령과 같은 의미이다.

mov rsp, rbp**
pop rbp

ret는 아래 명령과 같은 의미이다.
pop rip.
스택에 있는 값을 pop 하여 명령어 포인터 레지스터에 저장하겠다는 뜻

call은 다음 명령으로 이해하면 된다: push rip+5; jmp ~~~.
호출 할 함수가 끝난 다음 실행해야 하는 코드의 주소값을 스택에 푸쉬하고, 함수를 호출하겠다는 뜻

ret 명령어는 call 명령어와 단짝친구. call 명령어로 호출 된 코드면, ret 명령어를 반드시 수행해야 함.
너무나 당연한 이치이다. a 함수가 b 함수를 호출한다면, b 함수가 끝난 다음 다시 a 함수에 남은 코드를 실행 해야하니까..


함수의 context

context는 '문맥'이라는 뜻, 함수의 '문맥'이라하면 다음을 뜻한다:

  • 함수의 실제 코드 (instruction pointer)
  • 함수에 전달 된 인자들 (arguments)
  • 함수가 사용하는 지역변수들의 주소 (stack base pointer)
  • 함수가 끝나면 돌아갈 주소 (return address)

a 함수가 b 함수를 호출하면, b 함수는 b 함수만의 context를 가져야 하고, b 함수가 끝나게 되면 다시 a 함수의 context로 복원시켜야 한다.
이 과정에 실패하게 되면, 프로그램은 아주 높은 확률로 심각한 오류가 발생한다!


  • 스택은 시스템 해킹의 첫번째 수문장

  • 이 첫번째 수문장을 뚫고 완벽히 이해하면 이제 시스템 해킹을 진짜로 시작 할 준비가 되었다는 뜻

  • 스택을 이해하기 위한 팁으로는, 디버깅하며 직접 손으로 그림을 그려보는것을 추천

  • 스택 메모리와 레지스터에 명령어에 따라 어떻게 값이 들어가고 빠지는지를 시각화하며 공부하면 좀 더 수월하게 이해할 수 있을 것


스택을 해커가 마음대로 조작할 수 있다는 것

= 프로그램의 흐름을 해커가 마음대로 바꿀 수 있다.


같이 공부하면 좋은 지식

  • caller, callee
  • saved register
  • calling convention

0개의 댓글