스택 버퍼 오버플로우: 입력받는 크기를 정하지 않음 => 정해준 메모리를 넘어가면 다른 메모리에 영향을 끼칠 수 있음

입력할 떄 지역변수와 spf를 넘어가는 메모리를 입력한 뒤 반환주소값으로 돌아가지 못 하게 악성 셸 코드를 입력할 수 있음???

#include <stdio.h>

int main() {
	char buf[64] = {0, };
    
	scanf("%s", &buf);
}

 

 

스택 영역 (매개변수 생략): 

지역변수
sfp
반환 주소값

반환 주소값 데모

#include <stdio.h>

void b() {
	printf("B");

	return 0;
}

void a() {
	printf("A");
	b();

	return 0;
}

int main() {
	int32_t buf[18] = {0, };

	a();

	return 0;
}

main -> a -> b -> a -> main

프로그램이 실행이 되어야 하기 때문에 함수가 호출이 되어도 다시 돌아올 주소(함수가 끝난 부분)가 필요함

 

 

32, 64 비트 환경에서의 차이점 (나누기 8)

32 비트: 4바이트씩 처리

64 비트: 8바이트씩 처리

그러므로 각 환경에서의 데이터형이 조금씩 다름

 

 

포맷 스트링 버그: 서식 지정자를 정해주지 않음 => 다른 메모리를 읽어올 수 있음

#include <stdio.h>

int main() {
	char buf[24] = {0, };
    
	scanf("%22s", &buf);
    
    printf(buf) //printf("%22s", &buf)
}

 

 

 

#include <stdio.h>

int main() {
    char buf[32] = "ABCDE";
    char buf2[42] = "SECRET"; //절대 바뀌면 안 되는 비밀키라고 가정
    int idx = 0;
    //"지역변수"의 크기: 78byte
    scanf("%d", &idx);
    buf[idx] = "A";
}

idx 값이 0이라면 => ABCDE

idx에 32를 넣으면 => AECRET

RET의 0번째 인덱스에 침범하려면 => 85 바이트 입력

 

32 buf   0 ~ 31
42 buf   buf[32] = buf2[0]  ~ 41
4 idx   buf2[42] = idx[0] ~ 3
8 sfp   idx[4] / sfp[0] ~ 7
8 ret   sfp[8] = ret[0] ~ 7