Unions

Memory Layout

Buffer Overflow


Overflow Example

char* gets(char *dest){
	int c = getchar();
	char *p = dest;
	while(c!=EOF && c!='\\n'){
		*p++ = c;
		c = getchar();
	}
	*p = '\\0';
	return dest;
}
//c에 제한이 걸려있지 않다! ( strcpy, strcat, scanf도 마찬가지)

void echo(){
	char buf[4];
	gets(buf);
	puts(buf);
}
void call_echo(){
	echo();
}

Untitled

어셈블리로 보자.

# %rsp: 스택, %rdi: gets와 puts 입력
<echo>:
	sub $0x24, %rsp    //스택 확장
	mov %rsp, %rdi
	callq <gets>
	mov %rsp, %rdi
	callq <puts>
	add $0x24, %rsp    //스택 pop
	retq 

<call_echo>
	sub $0x8, %rsp     //함수 호출 위한 스택
	mov $0x0, %eax
	callq <echo>
	add $0x8, %rsp     //스택 pop
	retq

확보된 스택

Untitled

gets 호출: 리턴주소

Untitled

입력받음: overflow

Untitled

return 주소 부분이 overflow가 나서, 다음으로 진행할 코드가 틀어졌다 그 뒤에는 아무 상관 없는 코드만 잔뜩 실행되고, 어쩌다 return을 만나 끝난 것

이와 같은 상황을(retrurn address overwritten) Stack Smashing 이라 하며 이를 노린 공격을 Stack Smashing Attack이라고 한다.