- NEW초롱이의 하루
- kisa
- 길은 가면, 뒤에 있다
- C언어 예술가
- Zer0 day - Zer0 day
- Information Security
- Secure-EDU
- 앙큼한유채's 일상 Story
- Library of Ezbeat (잠정 폐쇄)
- The Factory
- 안드
- 모후모후의 커뮤니티
- 공학도의 잡다한 시선
- 안드2
- IT속에 코코아
- IP주소검색(whois)
- IP주소검색(좌표포함)
- 소프트웨어 경력 관리
- 해저 케이블 지도
- MAC주소검색
- IANA
- 포트번호검색
- 자신의IP확인
- 웹페이퍼캡처
- 나의패스워드보안등급
- 웹 취약점 분석
- IT용어정리
- GitHub
- 라이브러리 모음
- 웹마당넷
- 시스템콜참고
- BCD 변환
- 보안뉴스
- 코딩도장(C, Python)
- 백준알고리즘
- 코딩테스트 연습
- 웹 사이트 테스트
- 스크립트꾸미기
- ctf대회목록
- 전자신문
- hash 크랙
- CVE
- 도메인등록
- N클라우드
- BugBountyList
- 칼리공식사이트
- CR4FTING BOX
- 아스키코드 변환
- 웹 사이트 통계 및 평가
- PDF변환
- AWS 및 클라우드 정보
- 가상화 및 서버관련
- 티오리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- docker
- 프로젝트
- GPIO
- Shell script
- Java
- 메소드
- 네트워크
- Android
- System
- API
- RaspberryPi
- GUI
- synology
- LEVIATHAN
- Linux
- JSP
- centos docker
- 쉘 스크립트
- 리눅스
- 그라파나
- 클라우드
- Tkinter
- 라즈베리파이
- 자바
- 쉘 스크립트 if문
- 쉘 스크립트 기초
- ACL
- nginx
- Python
- 안드로이드
- Today
- Total
IT창고
System BufferOverFlow 본문
버퍼 오버플로우(Buffer OverFlow)에 대해 알아보겠습니다.
버퍼오버플로우는 정상적인 접근이 불가능한 메모리 공간에 임의의 코드를 집어넣는 기법으로 1995년도에 처음 phrack사이트에서 Aleph One이란 저자명으로 smashing the stack for fun and profit이란 문서를 올려 최초공개 되었습니다.
버퍼오버플로우가 생기는 원인으로 보안에 취약한 함수(scanf, gets, strcpy, ....)를 사용하는 경우입니다. 시스템 취약점의 거의 대부분은 버퍼오버플로우 취약점을 가지고 있습니다.
strcpy함수를 사용한 C언어 프로그램입니다. Hello! 인자를 넣어 보면 정상적인 출력이 됨을 확인할수있습니다. 하지만 만약 해당 인자에 메모리 크기를 넘어서는 값이 온다면 어떻게 될지 알아보겠습니다.
strcpy 함수는 buffer를 복사하며 크기를 확인하지않기 때문에 [20]을 넘어버리면 다른 메모리를 침범하게 되면서 에러가 일어납니다.
GDB 디버거로 확인해보면 eip레지스터에 A의 아스키코드(41)값이 들어가있는걸 확인할수있습니다. 이것을 메모리 변조라고 합니다.
이번에는 strcpy함수가 실행되는 부분에 브레이크를 걸어 더 자세히 살펴보도록 하겠습니다.
strcpy함수를 사용하기 바로 전에 멈춘 모습을 보면 saved ebp값이 정확하게 들어있습니다. 이제 ctrcpy함수를 사용하게 되면 입력받은 인자가 [20]보다 크기때문에 메모리가 입력받은 인자의 값으로 변조된 모습을 확인하수있습니다.
위와 같은 실험으로 오버플로우 취약점으로 레지스터값을 변조하는게 가능한걸 알수있습니다.
위와 같이 메모리를 변조하여 자신이 원하는 값을 출력하게 할수도 있습니다.
만약 변조해야할 값이 숫자라면 문자열 이스케이프를 사용해야합니다. 예를 들어 1234의 값을 넣고 싶다면
./target2 $(python -c 'print "A" * 20 +"\x21\x43\') 를 입력하여 원하는 숫자도 넣을수있습니다. 단 litle endian방식임으로 고려해서 넣어줘야합니다.
마지막으로 입력할수없는 숫자(bad character)에 대해알아보겠습니다.
1) 0x00 - NULL문자
- 마지막에 1byte만 가능합니다.
- 문자열의 끝을 NULL로 인식하는 경우에는 불가능합니다.
- 우회방법이 없기때문에 다른 방법을 찾아야만 합니다.
2) 0xff
- 쉘 자체의 버그입니다.
- bash 버그로 이 버그를 고친 bash2를 사용하면 사용가능합니다.
- chsh -> /bin/bash2 로 변경가능하며 단 다음번 로그인부터 적용이 됩니다.
3) 0x20, 0x0a, 0x09 (공백, 엔터, 탭) - 화이트 스페이스
- 우회 방법으로 문자열 이스케이프를 사용할 경우에는 사용가능합니다
- 단 0x0a는 그래도 사용할수없습니다.
'보안 > System' 카테고리의 다른 글
System RTL 공격기법 (0) | 2018.02.18 |
---|---|
System 쉘 코드 (0) | 2018.02.03 |
System 디버거(de-bugger) (0) | 2018.01.25 |
System main함수의 인자와 시스템콜 (0) | 2018.01.23 |
System 메모리구조와 어셈블리어 함수 (0) | 2018.01.22 |