Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
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