buffer overflow는 무슨 문제를 일으키는지 어셈블리어를 통해 좀 더 자세하게 알아보자
// echo
00000000004006cf <echo>:
4006cf: sub $0x18, %rsp
4006d3: mov %rsp, %rdi
4006d6: callq 400680 <gets>
4006db: mov %rsp, %rdi
4006de: callq 400520 <puts@plt>
4006e3: add $0x18, %rsp
4006e7: retq
// echo line
void echo(){
char buf[4];
gets(buf);
puts(buf);
}
// main
4006e8: sub $0x8, %rsp
4006ec: mov $0x0, %eax
4006f1: callq 4006cf <echo>
4006f6: add $0x8, %rsp
4006fa: retq
1. main에서 echo함수를 부르기 전에 echo함수를 호출 하고나서 실행할 코드의 주소를 returnAddress공간에 넣어준다. returnAddress에는 40 06 f6 이 들어가게된다.
2. echo가 실행되면 char buf[4]에 해당하는 공간만큼 (+ 여유공간도 같이) stack공간에 할당된다.
(sub $0x18, %rsp) 이 부분이 0x18(24)바이트 만큼 스택을 할당해 주는 코드
3. <gets>함수를 실행해 문자열을 받아온다.
4. 이 때 25개의 문자 (ex 0123456789012345678901234)를 받아오면 어떻게 될까
5. 문자열의 끝을 가리키는 '\0'과 25번째 문자인 '4'(34)가 returnAddress영역을 침범해버렸다
6. <echo> 함수가 종료되고, 다음에 실행될 코드를 찾기위해 returnAddress영역에서 40 00 34 를 가져왔는데 해당 값은 존재하지 않는 영역이거나, 참조 불가능한 영역이라서 Segmentation Fault가 발생하게된다.
'CS > SystemSoftware' 카테고리의 다른 글
SystemSoftware - Linking #1 (0) | 2021.06.03 |
---|---|
Attack Lab Solution Phase_1 ~ Phase_5 (3) | 2021.05.31 |
SystemSoftware - Buffer OverFlow #1 (0) | 2021.05.19 |
Bomb Lab Solution Phase_1 ~ secret_phase (1) | 2021.05.10 |
SystemSoftware - Machine data(Assembly) #2 (0) | 2021.04.30 |