공동체(Union)
구조체(Structure)는 메모리에 연속적으로 저장된다.
공동체는 시작 메모리 주소가 동일하며, 전체의 크기는 가장 큰 원소의 크기와 같다.

Union Byte Ordering
32비트 big endian에 0xf0f1f2f3f45f6f7


순서대로 예쁘게 들어간다.
64비트 little endian에 0xf7f6f5f4f3f2f1f0


64비트 unsigned long은 8바이트라서 한번에 다 들어간다.
ㅌ
Stack memory
Heap memory
Data
Text, Shared Libraries

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();
}

어셈블리로 보자.
# %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
확보된 스택

gets 호출: 리턴주소

입력받음: overflow

return 주소 부분이 overflow가 나서, 다음으로 진행할 코드가 틀어졌다 그 뒤에는 아무 상관 없는 코드만 잔뜩 실행되고, 어쩌다 return을 만나 끝난 것
이와 같은 상황을(retrurn address overwritten) Stack Smashing 이라 하며 이를 노린 공격을 Stack Smashing Attack이라고 한다.