stack에 정해진 버퍼보다 큰 공격 코드를 삽입하여 변환 주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행하도록 하는 방법
취약한 함수 scanf, gets, strcpy, . . . 등을 사용해서 발생하는 취약점
//target1.c
#include <stdio.h>
int main (int argc, char* argv[])
{
char buffer1[5] = {0,};
char buffer2[5] = {0,};
if(argc>1){
strcpy(buffer2, argv[1]);
}
printf("buffer1: %s\n", buffer1);
printf("buffer2: %s\n", buffer2);
return 0;
}
./target1 AAAAABB
buffer1: BB
buffer2: AAAAA
✔strcpy 함수는 문자열을 복사할때 문자열의 길이를 체크하지 않음
이처럼 처음 buffer2
의 크기 5byte를 초과하는 BB는 다른 메모리를 침범
훤씬 더 긴 인자를 전달하면 Segmentation fault 에러 발생
✔따라서 문자열 길이를 체크하는 strncpy를 사용하여 취약점 제거 가능
//target2.c
#include <stdio.h>
int main (int argc, char* argv[])
{
int number = 0x12345678;
char buffer[5] = {0,};
print("%x\n", number);
if(argc>1){
strcpy(buffer2, argv[1]);
}
print("%x\n", number);
return 0;
}
./target2 $(python -c 'print "A"*5 + "\x21\x43\x65\x87"')
12345678
87654321
//target3.c
#include <stdio.h>
int main (int argc, char* argv[])
{
char buffer1[5] = {0,};
char buffer2[5] = {0,};
gets(buffer2);
printf("buffer1: %s\n", buffer1);
printf("buffer2: %s\n", buffer2);
return 0;
}
./target3
AAAAABB
buffer1: BB
buffer2: AAAAA
gdb(디버거)를 통해 비정상적인 값의 입력으로 입력한 인자 중 $eip 레지스터에 들어간것을 확인 가능
$eip 레지스터의 값을 변경해서 실행의 흐름 변경 가능
heap
은 사용자가 동적으로 할당하는 메모리 영역(malloc()등등)Stack Guard : 메모리 상에서 프로그램의 복귀 주소와 변수 사이에 카나리 단어(Carnary Word)를 저장해뒀다가 그 값이 변경되었을 경우 프로그램 실행을 중단하는 기술
ASLR(Address Space Layout Randomization): 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화
카나리 단어(carnary word) : 메모리 변경 여부를 위해 저장해 두는 특정 값