반응형
프로그램 메모리 스택

메모리는 이와 같이 스택은 아래로 자라고, 힙은 위로 자란다.
스택 메모리에 데이터가 들어가면 주소값이 -가 된다.
스택 메모리에서 주소 값이 낮을 수록 먼저 들어왔다고 이해하면 된다.
스택 함수의 인수 순서
함수에 인자를 받는 경우를 생각해 보자.
void func(int a, int b){
int x, y;
x = a + b;
y = a - b;
}가 있다고 해보자.

스택의 베이스 포인터 (ebp)로 부터 12 만큼 떨어진 곳에 b를 넣은 후 8 만큼 떨어진 후에 a를 넣는다.
그리고 ebp를 기준으로 8만큼 위로 x를 저장한다.
ebp 아래에는 그 전 함수의 ebp가 저장되어 있고, 그 아래에는 함수가 끝났을 때 돌아갈 리턴 주소가 저장된다.
그리고 그 아래에는 현재 함수의 지역 변수가 저장되어 있다.

코드를 아래와 같이 만들어보자.
void func(int a, int b)
{
int x, y;
x = a + b;
y = a - b;
}
void main()
{
func(2,1)
}그리고 gdb를 돌려보자.
main 함수에 b를 지정하고 run 해보자
참고로 필자는 gdb-peda를 사용했다.

이런 결과가 나온다.
다음으로 넘어가면서 스택 메모리가 어떻게 변하는지 살펴보자

main + 18번째가 실행되고 나면 인자가 2,1 순으로 저장될 것이다.

call func에서 si 명령어로 함수 내부로 들어왔다.

mov 명령어가 두 개 실행되고 난 후 rsi, rdi가 1,2 순으로 저장되었다.
이는 리눅스 메모리 레이아웃의 함수 호출 규약에 의해 인자는 반대 순서로 저장된다는 것을 알 수 있다.
이제 x와 y의 위치도 궁금할테니 이는 여러분들이 직접 해보길 권한다.
함수 호출 체인의 스택 배치

함수가 호출되면 하위 주소로 계속 함수의 스택 프레임이 생성된다.
이를 가지고 우리는 스택 버퍼 오버플로우 공격을 행할 것이다.
반응형
'컴퓨터 과학 > 시스템보안' 카테고리의 다른 글
| 스택 버퍼 오버플로우 공격3 (0) | 2024.11.27 |
|---|---|
| 스택 버퍼 오버플로우 공격2 (1) | 2024.11.26 |
| 스택 버퍼 오버플로우 공격 (0) | 2024.11.22 |
| 리눅스 메모리 레이아웃 (0) | 2024.11.21 |
| 컴퓨터 구조 및 x86 아키텍처 (0) | 2024.11.20 |