jaewoo shim mar. 21. 2018securesw.dankook.ac.kr/iss18-1/hw2_2018_03_26.pdf3. fsb.c 파일을...

24
BoF(Buffer overFlow), FSB(Format String Bug) Jaewoo Shim Mar. 21. 2018

Upload: others

Post on 20-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

  • BoF(Buffer overFlow), FSB(Format String Bug)

    Jaewoo Shim

    Mar. 21. 2018

  • 목차

    개요

    주요 소프트웨어 취약점

    BoF(Buffer Overflow)

    FSB(Format String Bug)

    보호기법

    과제

    2

  • 개요

    3

  • 개요

    익스플로잇(Exploit)

    컴퓨터의 소프트웨어나 하드웨어 및 컴퓨터 관련 전자 제품의 버그, 보안 취약점 등 설계상 결함을 이용해 공격자의 의도된 동작을 수행하도록 만들어진 절차나 일련의 명령, 스크립트, 프로그램 또는 특정한 데이터 조각을 말하며, 이러한 것들을 사용한 공격 행위를 이름 – WIKI

    4

  • 개요

    버그 바운티(Bug Bounty)

    KISA S/W 신규 취약점 신고 포상제

    최소 5만원 ~ 1000만원의 포상금 지급

    삼성전자 버그 바운티

    최대 20만달러(약 2억 2600만원)

    기타 회사의 버그 바운티

    자사 제품을 대상으로 취약점 신고 시 포상금 지급

    5

  • 간단한 gdb 커맨드

    코드 디스어셈블 : disas 함수명

    Ex) disas main

    Ex) disas test

    특정 메모리 영역 확인 : x/숫자형식 포인터

    Ex) x/80wx 0xffff1234

    Ex) x/80wx $esp

    중단점 설정 : b *코드주소

    Ex) b *0x08041234

    Ex) b *main

    메모리 매핑 정보 확인 : info proc map

    Ex) info proc map

    프로그램 실행 : r

    Ex) r

    중단된 프로그램 계속 실행 : c

    Ex) c

    레지스터 값 확인 : info reg

    Ex) info reg

    Ex) i r

    위에서 언급한 명령어 이외에도 gdb는 매우 다양한 커맨드를 포함

    6

  • 주요 소프트웨어 취약점

    7

    Memory

    0x00000000 0x00

    0x00000001 0xca

    … ~

    0x08048000 ~

    ... ~

    … ~

    … ~

    … ~

    … ~

    … ~

    … ~

    0xffffffff

    4G byte

  • 주요 소프트웨어 취약점

    BoF(Buffer Overflow)

    정해진 메모리 공간을 초과한 입력을 허용하여 발생하는 취약점

    이를 이용하여 임의 파일을 읽거나, 쉘(/bin/sh)을 띄우는 것을 목표로 함

    8

    void test() { char buf[32]; scanf(“%s”,buf); } int main() { int i=0x41414141; test(); return 0; }

    [Stack]

    Return Address of main()

    Saved EBP of main()

    int i

    Return Address of test()

    H

    Saved EBP Of test()

    buf[32] L

    [Stack]

    Return Address of main()

    EBP of main()

    int i

    BBBB

    H

    BBBB

    BBBBBBBBBBBBBBBBBBB… L

    ????

  • 주요 소프트웨어 취약점

    9

  • 주요 소프트웨어 취약점

    10

    test() 함수의 스택프레임 31바이트의 임의 값을 넣었을 경우

    buf[32]

    Dummy data Saved EBP Return Address

  • 주요 소프트웨어 취약점

    11

    test() 함수의 스택프레임 48바이트의 임의 값을 넣었을 경우

    buf[32]

    Dummy data Saved EBP Return Address

    잘못된 주소지를 참조하는 것을 확인(Segmentation Fault)

  • 주요 소프트웨어 취약점

    쉘코드

    Shell(/bin/sh, cmd.exe 등)을 실행시킬 수 있는 코드

    공격자의 의도대로 임의의 작업을 수행하는 코드를 쉘코드라고 지칭하기도 함

    execve(&“/bin/sh”,&[“/bin/sh”,NULL],NULL)의 형태로 시스템콜을 호출

    프로그램 취약점에 의해 공격자가 쉘을 획득하면 임의 명령어를 실행 가능

    Shellcode – x86

    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80“

    Shellcode – x64

    "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"

    쉘코드는 다양한 형태로 제작 가능

    12

  • 주요 소프트웨어 취약점

    Shellcode – x86

    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80“

    13

    sys_execve eax : 시스템콜 넘버 ebx : “/bin/sh” 주소 ecx : “/bin/sh” 주소의 주소 edx : NULL int 0x80

  • 주요 소프트웨어 취약점

    X86 shellcode

    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80“

    14

    xor %eax,%eax push %eax push $0x68732f2f push $0x6e69622f mov %esp,%ebx push %eax push %ebx mov %esp,%ecx mov $0xb,%al int $0x80

    Eax 레지스터를 0으로 초기화

    스택의 상단에 /bin//sh이라는 문자열 구성

    구성한 /bin//sh 문자열의 주소를 가져옴

    argv[] 구성

    시스템콜 넘버를 al 레지스터에 저장

    시스템콜 호출

  • 주요 소프트웨어 취약점

    X86 shellcode

    “\x31\xd2\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80“

    15

    xor %edx,%edx xor %eax,%eax push %eax push $0x68732f2f push $0x6e69622f mov %esp,%ebx push %eax push %ebx mov %esp,%ecx mov $0xb,%al int $0x80

    Eax 레지스터를 0으로 초기화

    스택의 상단에 /bin//sh이라는 문자열 구성

    구성한 /bin//sh 문자열의 주소를 가져옴

    argv[] 구성

    시스템콜 넘버를 al 레지스터에 저장

    시스템콜 호출

    Edx 레지스터를 0으로 초기화

  • 주요 소프트웨어 취약점

    환경변수에 쉘코드 업로드

    16

    $ export TEST=`python –c ‘print “\x90”*200+”\x31\xd2\x31\xc0\x50\x68\x2f\x2f\x73 \x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80”’`

  • 주요 소프트웨어 취약점

    FSB(Format String Bug)

    데이터를 형식에 맞게 출력하기 위해 사용하는 포맷 스트링을 이용한 공격

    대표적인 포맷스트링

    %s, %x, %p, %c, %d, 등…

    Syntax

    %[parameter][flags][width][.precision][length] type

    17

  • 주요 소프트웨어 취약점

    예제코드

    18

    int main() { char buf[256]; read(0,buf,256); printf(buf); }

    공격자가 임의로 Format String을 사용하므로써 메모리 값을 누수시키는 것이 가능 메모리에 입력 또한 가능 : %n, %hn, %hhn

  • 보호기법

    1. 시큐어 코딩

    19

    void test() { char buf[32]; scanf(“%s”,buf); } int main() { int i=0x41414141; test(); return 0; }

    fgets(), read() 등 입력 크기를 조정할 수 있는 함수 사용

  • 보호기법

    2. 카나리(Canary)

    • 오버플로우를 탐지할 수 있는 카나리를 컴파일 시 설정

    • 최근 gcc에서는 아무 옵션을 주지 않아도 기본적으로 canary를 설정

    20

    [Stack]

    Return Address of main()

    Saved EBP of main()

    int i

    Return Address of test()

    H

    Saved EBP Of test()

    buf[32] L

    [Stack]

    Return Address of main()

    Saved EBP of main()

    int i

    Return Address of test()

    H

    Saved EBP Of test()

    buf[32] L

    Random Canary

    Random Canary

  • 보호기법

    3. NX bit 설정

    • 쉘코드의 실행을 막기 위하여 스택 영역의 실행권한을 차단

    • 최근 gcc에서는 아무 옵션을 주지 않아도 기본적으로 NX를 설정

    21

    NX 설정 미적용 시 NX 설정 적용 시

  • 실습

    1. Ip주소 : 220.149.250.147

    putty가 없다면?

    https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

    22

  • 과제

    1. 서버에 접근 시 다음과 같은 파일을 찾을 수 있습니다.

    1. bof, bof.c

    2. fsb, fsb.c

    2. bof.c 파일을 분석하여 버퍼 오버플로우 취약점이 존재하는 곳을 찾아 코드를 수정하세요.

    3. fsb.c 파일을 분석하여 포맷 스트링 버그 취약점이 존재하는 곳을 찾아 코드를 수정하세요.

    4. [가산점] bof.c 컴파일 시 생성되는 실행파일을 대상으로 공격을 수행하여 쉘을 획득하세요.

    5. 위 1~4번 과정을 수행하여 레포트를 제출하세요.

    과제기한 : 4월 9일(월)까지

    23

  • 24