CS/SystemSoftware

SystemSoftware - Buffer OverFlow #2

Henu 2021. 5. 19. 21:16
 

SystemSoftware - Buffer OverFlow #1

Buffer OverFlow 배열에 할당된 메모리 사이즈를 초과해서 사용하는경우 발생 보안 측면에서 가장 빈번하게 일어나는 이슈 중 하나 대표적인 상황 : input string의 길이를 체크하지 않을 때 가지고 있

hyeo-noo.tistory.com

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가 발생하게된다.