Stack Buffer Overflow (스택 버퍼 오버플로우)
: 할당된 버퍼 보다 많은 데이터가 삽입되었을 때 인접 메모리를 덮어 쓰게 되는 취약점이다
Buffer Overflow에 취약한 함수 목록
- strcpy, strcat, gets, fscanf, scanf, sprintf, sscanf, vfscanf, vsprintf, vscanf, vsscanf, streadd, strecpy, strtrns
Buffer Overflow의 취약점 원인
- 문자열 처리함수에서 입력값에 대한 길이 체크를 하지 않음으로 취약점 발생
Buffer Overflow 대응 방안
- 근본적인 대응 방안은 안전한 함수 사용 및 입력값 길이 체크
Buffer Overflow 순서
1. root 권한으로 setuid가 설정된 파일 작성
2. 일반 계정으로 환경변수 주소 구하는 코드 작성과 쉘코드 획득
3. 언어팩 세팅
4. 쉘코드 환경 변수 등록
5. 취약한 함수가 쓰인 프로그램을 gdb로 확인하여 변수의 시작 부분에서 EBP까지의 거리를 확인
6. 스택 구조 알기
7. 일반 계정으로 root 권한 파일 실행 및 root 권한 획득
1. root 권한으로 setuid가 설정된 파일 작성
2. 일반 계정으로 환경변수 주소 구하는 코드 작성과 쉘코드 획득
권한 상승 후 쉘 실행 시키는 쉘코드:
\x31\xc0\x89\xc3\xb0\x17\xcd\x80\xeb\x0f\x5e\x31\xc0\x50\x89\xe2\x56\x89\xe1\x89\xf3\xb0\x0b\xcd\x80\xe8\xec\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
3. 언어팩 세팅
- 다른 환경변수를 등록하기 전에 언어팩 세팅을 제일 먼저 해줘야 다른 환경 변수의 주소가 바뀌지 않는다
- 기본 세팅인 영문은 1바이트로 동작하기 때문에 2바이트인 한글로 언어팩을 변경해준다 ( 로그아웃시 초기화 )
4. 쉘코드 환경 변수 등록 및 주소 구하기
5. 취약한 함수가 쓰인 프로그램을 gdb로 확인하여 변수의 시작 부분에서 EBP까지의 거리를 확인
- root 권한으로 작성된 파일을 바로 gdb로 열게되면 동작이 제대로되지 않기 때문에 이름의 글자수를 똑같이하여 복사를 해준뒤 gdb로 열어서 확인한다
6. 스택 구조 알기
EBP - 스택의 하단부
ESP - 스택이 쌓이는 상단부
RET - 프로그램이 시작될 때 끝나고 돌아갈 주소를 저장해 놓은 곳
- 스택은 높은 주소에서 낮은 주소로 쌓이고 데이터는 낮은 주소에서 높은 주소로 쌓인다
- EBP 기준으로 -520 인 위치가 buffer의 시작 주소이다
- buffer에 데이터를 작성할 때 520 바이트를 작성하면 EBP전까지 작성한 데이터로 가득 채울 수 있다
- EBP전까지 데이터를 가득 채운뒤 4바이트를 더 작성하게되면 RET전까지인 EBP까지 가득 채울 수 있게된다
- EBP까지 데이터를 가득 채웠으면 환경변수에 저장해둔 쉘코드를 RET에 채워 넣으면 프로그램이 끝나고 공격코드가 실행되게 된다
7. 일반 계정으로 root 권한 파일 실행 및 root 권한 획득
공격코드
buffer ~ EBP전 | EBP | RET |
520bytes | 4bytes | 쉘코드 환경 변수 주소 |
./bof `perl -e 'print "A"x[거리], "[쉘 코드 환경 변수 주소]"'`
'시스템 해킹' 카테고리의 다른 글
ASCII Armor (0) | 2020.11.10 |
---|---|
ASLR ( Address Space Layout Randomization ) (0) | 2020.11.10 |
RTL ( Return to Libc ) (0) | 2020.11.06 |
DEP (Data Execution Prevention) (0) | 2020.11.06 |
Shellcode(쉘코드) 제작 (1) | 2020.11.04 |