SlideShare a Scribd company logo
1 of 123
Download to read offline
BEST OF THE BEST -
HACKERSCHOOL FTZ
by (re4lfl0w)
Date: 13. 7. 14.
메모리 레이아웃 기초
메모리 레이아웃
백도어란 무엇인가
문제 파악
문제 분석
의도 분석
공격
편집기 취약점
문제 파악
문제 분석
의도 분석
공격
함수의 위험성
문제 파악
문제 분석
의도 분석
공격
백도어
문제 파악
문제 분석
의도 분석
공격
레이스 컨디션
개념
문제 파악
문제 분석
의도 분석
공격
시스템 인터럽트의 위험성
개념
문제 파악
문제 분석
의도 분석
공격
암호화의 시작
개념
문제 파악
의도 분석
공격
리눅스 패스워드 파일 크랙
개념
문제 파악
의도 분석
공격
버퍼 오버플로우 입문
개념
문제 파악
의도 분석
공격
공유 메모리에 데이터 읽고 쓰기
문제 파악
의도 분석
공격
버퍼 오버플로우
개념
문제 파악
의도 분석
공격
스택 가드
개념
문제 파악
의도 분석
공격
루틴 분기 키값의 이해
개념
문제 파악
의도 분석
공격
루틴 분기 키값의 이해
개념
문제 파악
의도 분석
공격
함수 포인터 변조
개념
일 문제 파악
의도 분석
의도 분석
공격
함수 포인터 변조
개념
문제 파악
의도 분석
공격
포인터 활용
개념
문제 파악
공격
공유 라이브러리를 이용한 버퍼 오버플로우
개념
문제 파악
의도 분석
포맷스트링 복습
문제 파악
의도 분석
공격
참고 자료
시스템 해커의 기본소양을 익히기 위해
공격 방법에 관한 원리는 정확하게 아는 것과 비슷하게 아는 것은 다른 것이라 생각
되어
한 가지 문제라도 그것을 해결하는 것은 다양한 방법이 있기 때문
악성코드 분석 메모리 구조 디버깅 등에 대한 기본적인 지식 습득
메모리 레이아웃 기초
메모리 레이아웃
버퍼오버플로우 공격과 리버싱 같은 시스템 해킹 기법을 이해하려면 메모리의 레이아웃을
반드시 이해해야 한다
인자가 전달되는 순서를 확인
프로그램 실행
항상 코드를 작성한 후 실행 결과를 보기 때문에 실제 데이터가 처리될 때의 구조도 우리
가 작성한 코드와 똑같을 것이라는 착각에 빠질 수 밖에 없다 하지만 우리가 살아가는 사
회도 그렇듯이 컴퓨터의 모든 동작은 철저히 분업화 돼 있다
내가 작성한 코드는 언어의 문법만 준수하면 되지만 실행파일은 해당 실행 파일이 실행될
플랫폼의 환경에 맞춰 최적화 된 형태로 재구성된다 전자가 언어이고 후자가 어셈블리 언
어이다
파일은 과 의 개의 함수만 들어 있는 간단한 구조다 디스어셈
블하여 소스코드가 메모리에 어떻게 배치되는지 직접 확인하여 보자
함수에 제공한 인자값이 의 순서로 전달
스택은 지역변수가 쌓일수록 메모리의 낮은 주소 방향으로 데이터가 쌓이는 특이한 구조다
이는 힙과 스택의 여분 공간에 해당하는 메모리 영역을 최대한 효율적으로 사용하기 위함이
다
백도어란 무엇인가
문제 파악
인증 과 인가
컴퓨터 세계에서 가장 대표적인 인증 방법은 아이디와 패스워드 인증 아이디와 패스워드
문자열이 서버에 등록된 값과 정확하게 일치하는지 확인
하지만 현실에서도 정문으로 다니기를 원하지 않는 사람이 있듯 컴퓨터 세계에서도 정상
적인 경로 로그인 를 통하고 싶지 않은 사람이 있다 확인 과정을 회피하는 접근을 백도어 개
구멍 라 한다
서버의 파일 구조
권한에 가 걸린 파일을 찾는다
문제 분석
파일을 보면 이번 레벨에서는 은 물론이고 와도 관계가 있는 백도어를 찾
아 권한을 얻으면 된다는 사실을 추측할 수 있다
권한의 백도어란 계정의 소유이고 다른 계정으로 그룹 권한이 부여돼 있는
와 가 설정돼 있어야 한다는 의미다
명령어에서 옵션은 권한과 의 그룹 권한 중 하나라도
나 가 설정된 파일을 찾는다는 의미다 참고로 − 은 권한과 의
그룹 권한에 모두 나 가 설정된 파일을 찾는 옵션이다
즉 가 의미하는 것은 연산이며 가 의미하는 것은 연산이다
옵션은 검색 결과 중에서 에러가 발생한 결과를 버리겠다는 뜻이다 쉘에서 숫자
은 표준출력 는 표준에러 를 의미한다
은 윈도우 운영체제에 있는 휴지통이라고 이해하면 된다
월
리버싱을 통한 의사 코드 복원
소스코드를 복원할 때 배열의 크기나 분기문이 문으로 돼 있는지 문으로 돼 있는지
와 같은 부분에 대해 단순하게 복원하기 때문에 실제 소스코드와는 약간 다를 수 있다
프로그램의 실행 흐름 요약
스택을 구성한다
함수로 명령어를 실행
함수로 디렉토리 이동
함수를 이용해 문자열 출력
함수를 이용해 사용자로부터 입력
함수를 이용해 번 과정에서 입력받은 문자열을 금지 명령어인
와 비교
번에서 입력받은 문자열이 금지 명령어 가 아닌 경우 실행 루틴으
로 넘어감
함수를 이용해 실행되는 파일의 권한을 계정으
로 설정
함수를 이용해서 입력받은 문자열을 리눅스의 명령어로 실행
이 경우 입력받은 문자열이 리눅스에 있는 명령어라면 실행될 것이고 리눅스에 있는 임의
의 문자열이라면 당연히 명령어가 없다는 에러 메시지가 출력될 것이다
차단 권한 변경 방지
차단 백도어 쉘이 실행된 권한에서 의 패스워드를 볼 수 없게 난이도
를 조금 높게 함
함수에 진입하면서 스택을 구성하는 과정
의 문서에서 라는
곳에 자세히 설명
함수로 진입하기 전의 메모리 구조 의 주소를 스택에 저장
현재의 스택 포인터 를 스택의 베이스 포인터 에 저장
다음 단계에서 를 사용하므로 값을 지우지 않기 위해 단계에서 먼저 저장
함수에서 사용할 변수의 공간을 확보
라는 문자열을 스택에 올리고 함수를 호출한다 즉
라는 코드를 실행해서 서버에서 명령어를 실행해 화면을 지운다
라는 문자열을 스택에 올리고 함수를 호출한다 즉
이라는 코드가 실행되면서 서버에서 로 디렉토리를 이동하게 된다
레벨 의 권한으로 당신이 원하는 명령
어를
레벨 의 권한으로 당신이 원하는 명령어를 이라는 문자열을 스택에 올리
고 함수를 호출한다 즉 레벨 의 권한으로 당신이 원하는 명령
어를 ㅏ는 코드가 실행되면서 화면에 해당 문자열이 출력된다
나머지 부분도 위와 똑같은 방식이다
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
!
지금까지 복원한 내용은 파일을 실행했을 때 보이는 화면을 출력한다
레벨 의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
지금까지 분석한 내용과 화면에 출력한 내용이 같다는 것을 확인할 수 있다
배열주소 사이즈 형태의 함수 호출이 일어나면서 앞에서 분석한 내용과
동일하게 셀에서 입력한 문자열이 그대로 메모리에 들어가는 것을 확인할 수 있다
명령은 사용할 수 없습니다
셀에서 입력한 명령어가 인지 비교해서 다르면 인지 비교하는 루틴이 있는
으로 보내고 이면 명령어를 입력할 수 없다는 에러 메시지
를 출력하고 함수를 이용해 프로그램의 실행을 종료한다
명령은 사용할 수 없습니다
셀에서 입력한 명령어가 인지 비교해 다르면 입력값을 명령어로 실행하는 루틴이 있
는 로 보내고 이면 명령어를 입력할 수 없다는 에러 메시지를
출력하고 함수를 이용해 프로그램 실행을 종료한다
명령어의 결과가 출력되기 전에 두 줄이 띄워지는 것을 확인할 수 있다
함수를 실행한다 여기에서 는 의 를 뜻한다
입력받은 명령어를 실행하는 부분이다 즉 앞에서 입력한 명령어가 가 아니고
도 아니면 의 그룹 권한으로 명령어를 실행하는 부분이다
지금까지 리버싱한 내용을 토대로 소스코드에 해당하는 의사 코드를 완성하면 다음과 같다
화면의 모든 내용을 지운다
로 이동
레벨 의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
화면에 문자열 출력
주의할 지점
키보드로 입력 받음
를 입력했는지 확인
명령은 사용할 수 없습니다
명령은 사용할 수 없습니다
의 부여
입력받은 문자열을 서버에서 실행
배열과 배열에서 배열 크기를 입력하지 않은 것처럼 완벽하게 복
원된 소스코드는 아니다 하지만 이러한 사소한 차이를 제외하면 완성도 면에서는 거의 원
본 소스코드와 비슷한 형태일 것이다
의도 분석
리눅스 운영체제의 권한 체계를 이해하고 있는가를 묻고 있다
유닉스 계열의 운영체제는 다른 계정에게 읽기 쓰기 실행 권한을 줄 수 있다 즉
내가 만든 파일을 다른 계정의 사용자가 읽거나 수정하거나 실행할 수 있게 되는 것이다
이렇게 권한을 줄 때 와 라고 하는 기능을 이용하면 다른 계정 에서 만든 파
일을 내 계정 에서 읽거나 쓰거나 실행할 때 파일을 실행하는 동안 만큼은 다른 계정
의 권한을 잠시 얻을 수 있다
따라서 이 문제의 의도는 이러한 개념을 아는지 묻는 데 있으며 특히 명령어의 사
용을 차단함으로써 다른 계정의 권한을 얻은 일시적인 순간에 이 권한을 유지하는 방법을
고민하게 만들어 준다
일시적으로 다른 계정의 권한을 얻은 상황에서 이 권한을 유지할 수 있는 대표적인 방법 가
운데 가장 간단하고 정확한 방법은 역시 배시쉘을 실행하는 것이다 그러면 프롬프트가 생
기면서 일시적으로 얻었던 의 권한이 유지된다 좀 더 풀어서 설명하자면 일시적으로
와 를 제외한 명령어를 한 번만 실행할 수 있는 권한을 얻은 상태이므로 이
순간은 다 이 순간에 쉘을 적절히 실행한다면 소유의 정상적인 쉘에 머무르게
되고 완전한 권한을 얻게 된다
공격
로그인한 후 계정의 파일 구조를 확인
문제와 관련된 힌트를 확인
취약점이 있는 파일을 검색
공격 대상 파일을 실행해 파일의 동작 방식을 직접 확인
나 같이 쉘을 실행하는 명령어를 통해 권한의 쉘을 획득
의 패스워드 확인
번과 같이 쉘 명령어가 아닌 편집기를 이용한 우회법 추가 확인
로그인한 후 계정의 파일 구조를 확인
합계
월
월
월
문제와 관련된 힌트를 확인
권한에 가 걸린 파일을 찾는다
취약점이 있는 파일을 검색
월
공격 대상 파일을 실행해 파일의 동작 방식을 직접 확인
레벨 의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
나 같이 쉘을 실행하는 명령어를 통해 권한의 쉘을 획득
레벨 의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
의 패스워드 확인
번과 같이 쉘 명령어가 아닌 편집기를 이용한 우회법 추가 확인
레벨 의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다
단 와 는 제외
어떤 명령을 실행시키겠습니까
편집기 취약점
문제 파악
파일을 열어 문제의 실마리 확인
텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데
해킹에 관심이 있다면 의 단순한 편집 기능에 만족해서는 안되며 편집 기능을 넘어선 다
른 부가 기능에 대해 상세하게 알아둘 필요가 있다
이 문제에서 요구하는 편집기의 기능은 바로 명령어 실행 기능이다
합계
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
계속하려면 엔터 혹은 명령을 입력하십시오
이 같은 기능은 편집기 개발자가 사용자의 편의를 위해 제공한 기능이지만 사용자에 따
라 개발자가 생각하지 못한 기능을 수행하게 할 수도 있다 이런 가능성은 실수 혹은 파워
유저의 호기심에 의해 발견되는 경우도 많다
문제 분석
계정의 사용자 권한에 가 설정돼 있는 파일을 찾은 다음 이 파일을 실행해 보자
월
편집기와 똑같다 분명히 편집기가 확실한 것 같은데 실행파일의 이름이 가 아니라
다 실행 파일을 다른 이름은 로 복사했나 와 같은 의문을 가지고 정확하게
분석하는 습관을 들여야 하므로 여기에 따라 파일을 확인해 보겠다
월
월
월
와 까지 파일 크기를 비교해 보니 는 크기가 전혀 다른
편집기와는 다른 파일임을 알 수 있다
아울러 이나 파일에 링크를 걸어서 사용한 것도 아니다 오히려 크기가 훨씬 작다 하
지만 문제의 파일을 실행해 사용해 보면 편집기가 분명하다는 사실을 알 수 있다
파일 크기가 다른데 동일한 기능을 제공한다는 것이 이상하면서 신기하다
리버싱을 통한 의사 코드 복원
를 이용한 소스코드 분석
프로그램의 실행 흐름
스택을 구성한다
을 이용해 실행되는 파일의 권한으로 계정을 설
정한다
함수를 이용해 편집기를 실행한다 즉 의 권한으로 편집기를 실
행하는 실행파일이다
과정
함수로 진입하기 전의 스택 구조 메모리 구조 의 주소를 스택에
저장한다
현재의 스택 포인터 를 스택의 베이스 포인터 에 저장한다
과 은 함수에서 사용할 변수의 공간을 확보한다
숫자 를 번 스택에 올리고 함수를 호출한다 즉
이라는 코드가 실행된다
코드가 실행되면 파일은 당연히 일시적인 의
권한을 가지게 된다
실행할 명령어에 해당하는 문자열인 가 저장돼 있는 문자열의 주소를 스택에 올리고
함수를 호출한다 즉 라는 코드가 실행된다
복원된 소스코드
먼저 의 를 부여한 후 코드를 이용해 편집기를 실행한다
그러므로 당연히 실행 파일의 크기는 나 보다는 작지만 편집기가 실행
된다 아울러 파일은 일시적인 계정의 권한으로 편집기를 실행하게
된다
의도 분석
애플리케이션의 상세 명령어를 알고 응용할 수 있는 수준이 됐을 때 해킹할 수 있는 상황을
경험할 수 있게 해준다 따라서 프로그램을 사용할 때 다양한 상황과 조건을 고려하는 습관
을 들이자
공격
먼저 파일이 의 권한으로 실행되는지 확인해 보자
보다시피 는 이지만 가 의 권한을 가지고 있으므로 가 실
행할 수 있는 환경임을 알 수 있고 앞에서 정확하게 분석했음을 확인할 수 있다
이러한 고급 기능과 관련된 배경 지식을 가지고 있다면 개발자가 의도하지 않은 기능을 수
행할 수 있다 이처럼 개발자가 의도하지 않은 명령을 실행할 수 있는 것이 해킹의 시작이
다
깔끔한 해킹이란 결국 앞에서 보여준 것과 같이 불완전한 쉘을 얻는 것이 아니라 완전한 쉘
을 얻는 거ㅓㅅ이다
그럼 어떻게 완전한 쉘을 얻을 수 있을까 바로 편집기에서 단순한 일회성 명령어를 실행
하는 것이 아니라 쉘을 실행하는 것이다 그렇게 하면 일시적으로 얻은 의 권한으로
쉘이 실행되고 해당 쉘이 유지되는 동안 여러분은 계정이 된다 참고로 웹 해킹에서
도 이 같은 원리로 공격자가 웹 쉘을 올리는 데 성공하면 리버스 털넷을 연결해서 완전한 쉘
을 얻을 수 있다
함수의 위험성
문제 파악
함수는 시스템에 명령을 실행할 때 사용하는 함수다 프로그램을 개발하는 데 반드
시 필요한 함수다
마이크로소프트 워드에서 현재 날짜를 입력하는 기능이 있다 이 기능도 시스템에서
함수를 이용해 날짜를 읽어와서 날짜 포맷을 선택할 수 있게 한 다음 출력하는 기
능에 불과하다
먼저 파일을 열어 문제의 실마리를 파악해 보자
다음 코드는 의 소스이다
이를 이용하여 의 권한을 얻어라
동시에 여러 명령어를 사용하려면
문자열 형태로 명령어를 전달하려면
는 과 동일하게 도메인의 주소를 확인하는 프로그램이지만 기본적으로 유닉
스 계열 운영체제에 탑재돼 있다
과의 차이점은 쿼리할 서버의 옵션을 명령어를 사용할 때 입력해야 한
다는 점이다
타입의 배열 선언
인자가 개 입력되지 않으면 에러 출력
하고 프로그램을 종료
입력받은 주소 문자열 완성
명령어 마지막에 옵션을 추가
위에서 조합된 명령어 실행
프로그램 흐름
먼저 라는 문자열을 배열에 넣는다
문자열 뒤에 명령어 다음에 입력된 문자열을 붙인다
입력받은 문자열 뒤에 라는 문자열을 붙인다 가령
이라는 주소를 입력하면
라는 명령어 문자열이 조합된다
즉 명령은 결국 입력받은 문자열에 해당하는 서버에서 운영중인 프로그
램의 버전을 확인하는 명령을 실행한다 이는 해당 서버에서 취약한 버전을 운영 중인지 확
인할 수 있는 유용한 명령이다 하지만 요즘에는 설정에서 이와 같은 버전 요청에 대
해 회신하지 않도록 설정하고 있으므로 취약한 서버가 아니라면 버전에 대한 회
신이 없을 것이다
문제 분석
공격 대상 파일 찾기
먼저 레벨 문제에 해당하는 취약한 파일을 찾는 방법으로는 가지가 있다 즉 라
는 파일명을 알고 있으므로 파일명으로 검색할 수도 있고 레벨 이나 레벨 에서 했던 것과
같이 파일의 권한으로 찾을 수 있다
파일명으로 를 이용해 찾는다
월
다음 레벨의 계정인 의 권한으로 가 설정돼 있고 의 권한으로
가 설정된 파일을 찾는 방법이다
월
리버싱을 통한 의사 코드 복원
입력한 주소와 관계된 부분
프로그램 실행 흐름
스택을 구성한다
의 값이 인지 검사해 가 아니면 에러 메시지를 출력하고 프로그램을 종료한
다 여기서 가 라는 의미는 명령어 개와 인자 개를 의미한다
의 값이 이면 입력받은 문자열 형태의 명령을
만들어 실행한다
를 번 스택에 올리고 함수를 호출한다 즉 라는
코드가 실행되어 를 실행하는 동안 가 되게 만든다
끝으로 지금까지 조합된 문자열인 의 주소를 스
택에 올리고 함수를 호출한다 즉
라는 코드가 실행되면서 에 대한 프로그램의 버전을 조회한다
복원된 소스코드
원본 소스와 비교하면 문자열을 저장하는 배열의 배열 크기와 배열명 정도의 차이
만 있을 뿐 소스코드의 흐름에는 크게 차이가 없다는 사실을 알 수 있다 물론 배열 크기도
치밀하게 계산하면 추측할 수 있지만 흐름상 크게 지장이 없으므로 신경쓰지 않아도 된다
이처럼 컴파일러가 컴파일하는 과정을 정확하게 이해하면 컴파일러에 의해 만들어진 어셈
블리어 코드를 가지고도 거의 정확한 원본 소스코드를 만들어 낼 수 있다
의도 분석
함수에 여러 개의 명령을 실행할 수 있게 문자열을 전달하는 방법을 이해하고 직접
그렇게 할 수 있어야 한다는 점이 중요하다
공격
이 실행파일에 어떤 취약점이 있다는 것인지 힌트를 다시 보면서 고민해 보자
동시에 여러 명령어를 사용하려면
문자열 형태로 명령어를 전달하려면
첫번째 힌트인 동시에 여러 명령어를 사용하려면 이라는 힌트는 함수에서 이러
한 기능을 실행해본 적이 없다면 이해하기가 쉽지 않다 하지만 리눅스 쉘에서 문자열을 어
떻게 전달하는지를 잘 생각해 보면 의외로 쉽게 풀 수 있다
첫번째에서는 번째 인자인 가 제대로 전달되지 않는다 이것은 소스코드를
보면 알겠지만 에 첫번째 인자만 처리하기 때문이다 그러므로 두 번째 인자를 전달
할 수 없다 그래서 명령어 사용법이 틀린 것이고 명령어 사용법을 알려주는 에러 메시지가
출력되는 것이다
그렇다면 어떻게 과 을 하나의 인자로 전달할 수 있을까 유닉
스 계열의 쉘에 익숙한 독자라면 추측할 수 있을 법한 방법인 문자열 형식의 입력을 이용하
는 것이다 쌍따옴표를 이용해 인자값 개를 하나로 묶어줌으로써 프로그램에
하나의 인자를 전달한 것처럼 할 수 있다
여기서 또 한 가지 힌트는 과 같은 명령어의 입력값을 전달하는 것이 아
니라 유닉스 계열 서버에서 실제로 실행될 수 있는 명령어를 연속해서 전달하려면 을 이
용하면 된다 은 쉘에서 명령어를 한 줄에 연속해서 적을 때 이용할 수 있으며 이는
함수에도 동일하게 적용된다
초기 명령어는 이지만 를 통과해서 시스템에서 실행
되는 명령어는 다 그러면 명
령어는 아래와 같은 순서대로 실행된다
과 는 이해가 된다 같은 경우는 라는 명령어에 개의 인자로 와 가
전달되는 상황이다 그러므로 위 실행 결과의 마지막 줄에서
라는 명령어가 없다는 에러 메시지가 출력된다
이제 어떤 명령어를 실행해야 할지 추측할 수 있을 것이다
우리가 의도한 대로 명령이 정확하게 실행되어 다음 레벨인 계정의 패스워
드가 출력된 것을 볼 수 있다 하지만 깔끔하게 해킹했다고 할 수가 없다
가 실행되는 순간에 의 권한으로 쉘이 실행되면서 의 권한이 유지된 모
습을 볼 수 있다 이로써 훨씬 더 완전한 형태의 해킹에 성공했다
월
월
하지만 이 파일을 실행하더라도 모든 권한이 이다 이는 를 설정하지 않았기 떄문
이므로 에 대한 추가 설정을 해줘야 한다
월
를 추가하고 적용된 것을 확인한 후 해당 파일을 실행하면 계정의 사용자 권
한으로 쉘이 실행됐다 백도어의 유용성을 한 번 더 확인해 보자
로 로그인해서 실행해도 권한으로 쉘이 실행된다 으로 로그인해야만
권한을 얻을 수 있는 한계마저 뛰어 넘었다 이것이 백도어의 매력이다 이러한 특성
때문에 해킹당한 서버나 에는 끊임없이 백도어가 설치되는 것이다
백도어
문제 파악
레벨 에서는 로컬 백도워를 배웠다 하지만 로컬 백도어보다는 당연히 원격 백도어가 훨씬
공격자에게는 편리한 백도어다
이번 문제는 서버 운영체제 해킹에 해당하는 영역이므로 데몬의 개념을 알아야만 풀
수 있으므로 먼저 리눅스 시스템의 부팅 순서를 알아보자
부트 로더 실행
커널 이미지 메모리 로딩
파일에 있는 내용 중 선택된 모드로 프로세스 실행
데몬에 의한 네트워크 데몬 가동
부팅 완료
먼저 파일을 열어 문제 해결을 위한 실마리를 찾아보자
누군가 에 백도어를 심어놓았다
로컬 백도어와 포트 백도어로 용어에 차이를 두는 것은 백도어를 이용하는 곳이 로컬 시스
템인지 아니면 네트워크를 통한 원격인지의 차이일 뿐이며 인증가 인가를 우회해서 신원
확인을 거치지 않은 채로 로그인하겠다는 목적은 동일하다
문제 분석
합계
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
월
가장 중요한 부분은 계정의 권한으로 라는 서비스를 이용해
파일이 실행된다는 것이다
보다시피 서비스가 사용하는 포트가 임을 알 수 있다 따라서 공격할 때 번
포트로 접속을 시도하면 된다 여기서 포트로 접속을 시도하면 된다는 말은 서버
에 포트가 으로 나타나야 한다는 의미다
포트가 열려 있음을 알 수 있다
그런 파일이나 디렉토리가 없음
데몬을 시작하기 위한 설정 파일이 없으므로 네트워크 백도어가 제대로 구동되지 않는다
현재의 환경을 파악하기 위해 포트로 접속해 보면 파일
이 없기 때문에 아무런 실행 결과가 나타나지 않는다
의도 분석
백도어는 실행한느 위치에 따라서 로컬 백도어와 원격 백도어로 분류할 수 있다 용어에서
도 짐작할 수 있겠지만 로컬 백도어보다는 원격 백도어가 공격자에게는 훨씬 유용하다 어
플리케이션의 취약점을 이용해서 원격에서 강제로 실행 흐름을 바꾸는 원격 익스플로잇이
여러분의 목표가 되어야 하겠으나 지금 단계에서는 리눅스 운영체제의 설정을 이용한 기본
적인 원격 백도어라 할 수 있는 포트 백도어를 제시함으로써 여러분에게 원격 백도어의 유
용성을 소개하고 있다
공격
파일을 열어보고 명령 실행
파일을 열어보고 로그인한 계정을 확인하는 명령어까지 실행하도록 작성했다
누군가 에 백도어를 심어놓았다
권한으로 정확하게 실행된다는 것을 알 수 있다
계정의 패스워드 확인
암호가 원래 나와야 되는데 깨져서 나오지 않는다
배시쉘 실행
완벽한 쉘을 얻기 위해 배시쉘 실행
보다시피 서버와 연결이 된 것처럼 보이지만 입력한 명령에 대한 출력 결과가 보이지 않는
것으로 봐서 쉘이 제대로 실행되지 않음을 확인할 수 있다
서버에서는 와 같은 원격 접속용 프로그램이 지원되지 않으므로 각
자의 에서 원격으로 아래와 같이 접속해 보자
레이스 컨디션
개념
에 대한 문제로서 취약점과 공격 방법에 대한 개념을 정확하게 이해하지 않
고서는 풀 수 없을 정도로 어려운 문제다 경쟁상태란 다수의 프로세스가 서로 동일한 자원
을 할당받기 위해 경쟁하는 상태를 말한다 물론 경쟁 상태에 빠진 다수의 프로세스에게서
발생할 수 있는 최악의 상황 중 하나는 역시 즉 교착상태다
경쟁 상태가 일어나는 상황 중에서 중용한 정보가 담긴 파일의 소유를 경쟁할 수 있는 상황
이 예제로 제시돼 있다
다른 계정의 권한에 접근해야 하므로 가 걸려 있어야 한다
임시 파일을 생성해야 한다
공격자가 임시로 생성되는 파일을 정확하게 알아야 한다
레이스 컨디션 환경에 대해 간단히 설명한다
임시 파일의 생성을 시도
임시 파일이 생성되면 내용을 쓰고 바로 파일을 삭제 공격자 입장에서는 임시 파일
에 내용을 쓰고 삭제하는 순간이 너무 짧은 것이 문제다
임시 파일의 생성에 실패하면 프로그램을 종료
다시 정리하자면
파일 생성
파일 생성에 성공하면 생성된 파일에 내용 쓰기
쓴 내용을 읽어들여 처리 사용
파일 삭제
구체적으로는 번과 번 사이에 취약점이 존재하게 된다 공격할 수 있는 틈이 있긴 하지만
너무 짧은 시간 간격이라서 결국 공격용 프로그램을 작성해야 한다는 것이다 프로그램을
작성해 보면 알겠지만 프로그램으로 공격해도 타이밍을 맞추기 어려운 짧은 시간 간격이라
서 결국 타이밍이 맞는 순간까지 집요하게 프로그램을 반복해서 실행해야 한다는 사실을 알
게 될 것이다
진행 흐름을 다시 한 번 정리해 보자
공격 프로세스에서 파일을 만든다
공격 프로세스에서 파일을 원본으로 하는 링크 파
일을 만든다 링크가 취약한 프로세스가 생성하고 삭제하는 파일의
이름이다
레이스 컨디션 취약점이 있는 프로세스를 시작한다
취약한 프로세스가 파일을 생성하려고 하지만 공격 프로세스가 만
들어 둔 링크인 파일이 이미 있으므로 추가로 파일을 만들지 않는
다
취약한 프로세스가 링크에 내용을 쓴다 링크에 내
용을 쓰면 원본인 파일에 내용이 쓰여진다
취약한 프로세스가 쓴 내용을 사용한 뒤 파일을 삭제하고 종료한다
결국 내용이 쓰여진 파일이 남아 있으므로 쓴 내용을 볼 수 있다
키보드 입력을 시도하거나 공격 코드를 짜서 시도해 보면 알겠지만 위의 순서에서 공격 프
로세스가 해야 하는 번과 번 과정을 취약한 프로세스가 번 과정을 거치기 직전에 수행해
야만 위의 순서대로 공격에 성공할 수 있다
문제 파악
프로그램은 디렉토리에
라는 이름의 임시파일을 생성한다
이를 이용하여 의 권한을 얻어라
그런 파일이나 디렉토리가 없음
문제 분석
리버싱을 통한 의사코드 복원
실행 흐름 정리
스택을 구성한다
함수로 파일을 만든다
파일 생성에 성공하면 라인으로 가고 실패하면 다음 라인으로 간다
파일 생성 실패 메시지를 출력한다
생성 시도한 파일을 삭제한다
프로세스를 종료한다
에서 파일 생성에 성공한 경우 대상 파일에 문자열을 쓴다
대상 파일을 삭제한다
언어로 정리하자면
파일생성 실패시의 처리
파일생성 성공시의 처리
복원된 소스코드
임시 파일 생성
임시 파일 생성에 실패하면 에러 메시지 출력
파일 삭제 후 종료
파일 삭제
임시 파일 생성에 성공하면 파일에 문자열을 쓰고 파일 삭제
여기석 공격 포인트는 부분이 된다 프로세스에서 임시
파일을 생성하기 직전에 공격 프로그램에서 임시 파일에 먼저 링크를 걸게 되면 링크를 건
파일을 통해 미리 만들어 둔 파일에 로 패스워드를 적
게 하는 것이다
이처럼 파일에 쓰여지는 내용이 의 패스워드 이므로 레이스 컨디션을 이용한 공격에
성공하기만 하면 된다 그래서 이전 레벨과 달리 의 권한으로 가 설정되지 않은
이유를 이해할 수 있다
의도 분석
레이스 컨디션의 정확한 개념을 이해하고 파일 생성 시점에서 우선순위를 선점해 공격 대
상 프로세스보다 먼저 파일을 만들고 링크를 걸 수 있는지를 확인하는 문제다
공격
공격 코드에서 염두에 둘 부분은 타이밍을 빼앗을 수 있는 순간을 만들어 내기 위해 취약한
프로그램과 공격 프로그램을 여러 차례 반복해서 실행해야 한다는 것이다
취약한 바이너리의 반복 실행
레이스컨디션 익스플로잇
파일이 존재합니다
파일이 존재합니다
파일이 존재합니다
파일이 존재합니다
파일이 존재합니다
파일이 존재합니다
파일이 존재합니다
시스템 인터럽트의 위험성
개념
시스템 인터럽트는 프로세스 간에 주고받는 신호로서 시스템 개발에서는 중요한 요소다 이
번 레벨에서는 이 같은 시스템 인터럽트를 이용해 시스템의 취약점을 발견하고 이를 이용하
는 것이 핵심이다
인터럽트 종류
문제 파악
인포샵 의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다
텔넷 접속 서비스
하이텔 나우누리
천리안
접속하고 싶은 를 선택하세요
안내 화면에서 습관적으로 엔터를 입력하자 다음과 같이 유닉스나 운영체제 사용자에
게 익숙할 법한 사용자 메뉴가 나온다
텔넷 접속 서비스
하이텔 나우누리
천리안
접속하고 싶은 를 선택하세요
우리가 많이 사용하는 시그널은 이미 차단돼 있었고 나 와 같은 프로세스를
종료시키는 시그널만 실행되어 수없이 재로그인을 해야만 했다
문제 분석
리버싱을 통한 의사 코드 복원
실행 흐름
스택을 구성한다
함수를 실행한다
함수를 실행해 문자를 하나 입력 받는다
함수를 실행한다
함수로 많은 문자열을 출력한다
함수로 시그널을 처리한다
함수로 단어를 입력받는다
함수를 실행한다
함수로 문자열을 출력한다
복원된 소스코드
털넷 접속 서비스
하이텔 나우누리
천리안
시그널이 메뉴 출력 다음에 처
리된다
각종 시그널을 무시한다
접속하고 싶은 를 선택하세요
잘못 입력하셨습니다 접속을 종료합니다
메뉴를 선택하는 화면 다음에 시그널을 설정한다 그래서 메뉴 화면에서만 시그널이
시스템으로 전달되고 나머지 시그널은 무시된다 단 시그널을 입력하면 프로그램이
종료되면서 세션이 끊긴다
의도 분석
하나의 프로세스 프로그램 단위에서 함수 간에 서로 값을 주고받는 방법으로 인자와 리턴
값이 있다 프로그램 내에서 값을 공유할 필요가 있는 것과 마찬가지로 규모가 큰 프로젝트
를 진행할 때는 다른 프로그램 다른 프로세스와도 값을 주고받을 필요가 생긴다
그렇다면 프로세스 간에는 어떻게 인자를 전달할 수 있을까 가장 대표적인 방법이
네트워크 통신 파일 환경설정 텍스트 등 데이터베이스 등 다양한 방법이 있지만 지
금처럼 하드웨어와 네트워크 환경이 급격히 좋아지기 전까지는 이번 레벨에서 소개한 인터
럽트를 많이 이용했다 물론 인터럽트는 네트워크 통신이나 파일 및 데이터베이스처
럼 여러분이 알고 있는 함수 간에 값을 주고받는 것처럼 많은 데이터를 자연스럽게 주고 받
을 수는 없다
이번 레벨을 풀려면 지금까지 분석한 시그널 처리에서 시점의 중요성과 함께 서버의 계정
로그인과 관련된 환경설정까지 알아야 한다
공격
인포샵 의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다
프로그램이 실행되자마자 처음으로 만나게 되는 힌트 화면에서 를 눌러 프로그램
의 흐름을 막아 버리면 다음과 같이 의 쉘이 나타난다
합계
월
월
월
월
월
월
월
한 가지 눈여겨봐야 할 부분은 파일과 파일의 가 라는 점이다 이는 쉘
을 획득한 사용자가 파일을 삭제하거나 수정해서 다른 도전자의 문제 풀이에 영향을 줄 수
없게 한 안전 조치이니 참고하기 바란다
암호화의 시작
개념
반드시 알아야 할 것은 암호화 알고리즘 암호문 평문 이다
아스키 테이블
문제 파악
명령을 실행하면 패스워드 입력을 요청한다
패스워드는 가까운곳에
상상력을 총동원하라
진수를 진수를 바꿀 수 있는가
계산기 설정을 공학용으로 바꾸어라
월
진수
진수
실행 흐름
스택을 구성한다
함수로 메모리 공간을 할당한다
함수로 문자열을 출력한다
함수로 문자열을 입력받는다
함수로 에서 입력받은 문자열을 비교한다
번 과정의 비교 결과를 검사한다
함수로 문자열을 출력하고 프로세스를 종료한다
함수로 명령어를 실행한다
복원된 소스코드
입력받은 문자열의 앞자리 자만 체크한다
디버깅에서는 없었지만 습관적으로 해제해 주는 것이 좋다
의도 분석
진수와 진수의 관계를 알고 있어야 하고 진수 진수 진수가 아스키 코드와 어떤
관계를 맺고 있는지 알아야 한다 특히 진수와 아스키 코드와의 연관 관계를 정확하게 알
아야 하고 아시크 테이블을 이용할 수 있어야 한다
공격
맨 앞 바이트만 비교하기 때문에 뒤에 더 많은 문자열을 입력하여도 통과한다
리눅스 패스워드 파일 크랙
개념
리눅스의 패스워드 체계에 관해 묻는 문제다
초기의 리눅스에서는 파일에 평문 형태로 패스워드를 표기했으나 패스워드를
아무나 보면 안된다는 보안 의식이 생기면서 지금처럼 모든 계정이 읽을 수 있는
에 있는 패스워드 부분은 로 가려져 있고 실제로 암호화한 패스워드는 계정만
읽을 수 있는 권한이 부여된 에 저장된다 그러므로 암호화 패스워드를 훔쳤다
는 건 시스템의 권한을 획득했다는 의미가 된다
월
월
리눅스의 패스워드는 파일에 단방향 암호화 알고리즘인 해쉬 암호화 알고리즘
으로 암호화해서 저장한다 단방향 알고리즘을 쓰는 이유는 평문 패스워드로 복호화할 수
없도록 하기 위해서다
단방향 해쉬 알고리즘으로 암호화된 패스워드의 원본인 평문 패스워드는 일반적으로 사전
대입법이나 기법을 사용한다
문제 파악
의 파일이 서버 어딘가에 숨어있다
그 파일에 대해 알려진 것은 용량이 이라는 것 뿐이다
월
월
월
월
바이트 단위로 검색하자 파일명부터 의심스러운 라는 파일이 검색된다 이로써 힌
트에서 제시된 은 바이트 단위임을 알 수 있고 다른 계정이 수정하지 못하도록 가
로 지정돼 있고 계정만 읽을 수 있도록 권한이 설정돼 있음을 확인할 수 있다
중
시스템 해킹을 공부할 때는 운영체제의 동작 원리는 물론 운영체제를 관리하는 방법까지 알
아두면 더 유리하다는 사실을 알아두기 바란다
의도 분석
이번 레벨에서는 명령어의 옵션을 알고 있는지와 시스템의 패스워들르 크랙할 수
있는지 묻고 있다
털넷 서비스가 돌고 있는 상황이므로 원격에서 크랙하는 것도 가능하다 하지만 일반적으로
원격 브루트포스 방식은 서버나 네트워크 관제실에서 방어하고 있기 때문에 크랙에 성공하
기가 쉽지 않다 반명 사람들이 많이 사용하는 단어를 정리해서 그 단어를 기반으로 패스워
드와의 일치 여부를 확인하는 딕셔너리 공격 기법 정도가 무난할 것이다
공격
딕서녀리 공격에 성공하는데 초가 걸렸다
공격 조건을 보면 단순 알파벳에 불과하다 이것을 검색하는데 초가 걸렸고
숫자나 특수문자까지 조건으로 추가하면 훨씬 더 많이 걸릴 것이다
버퍼 오버플로우 입문
개념
앞으로 출제되는 문제를 푸는 데 필요한 버퍼 오버플로우 기법을 이해하기 위해 메모리의
값을 조작하는 방법을 설명한다
시스템 해커가 되고자 한다면 실제 메모리의 구조를 꼭 이해해야 한다
문제 파악
버퍼 오버플로우 공격을 시작하기 위해 지역변수가 스택에 배치되는 순서와 위치를 정확하
게 알 수 있게 하는 준비 과정으로 이해하면 된다
차이가 나는 것을 확인할 수 있다
라는 문자열을 출력
배열에 바이트만큼 키보드 입력을 받음
배열의 문자열이 인지 확인
배열의 문자열이 이면 을 출ㄹㅕㄱ
실행될 프로세스의 유효 를 즉 으로 설정
실행 그러므로 의 로 배쉬셀을 실행
위의 순서를 보면 배열을 오버플로우시켜 배열에 라는 문자열만 넣으면
권한의 쉘이 나타나고 를 통과하게 된다
의도 분석
버퍼 오버플로우를 비롯한 각종 시스템 해킹에 포함되는 공격 기법은 결국 특정 값을 원하
는 메모리에 쓸 수 있는가 가 핵시ㅁ이다 그렇기 때문에 이후 레벨에서 소개할 공격의 개
념을 정확하게 이해할 수 있게 이번 레벨에서는 라는 임의 문자열을 배열에 쓰는
방법을 묻고 있다
공격
월
명령을 이용해 권한으로 가 설정된 파일을 찾는다
이번 레벨에서는 배열의 크기보다 큰 데이터를 입력함으로써 우리가 원하는 데이터를 특정
위치에 강제로 입력할 수 있다는 점을 알아야 한다 이러한 내용을 공부하는 궁극적인 이유
는 리턴 주소 를 우리가 원하는 주소로 덮어써서 우리가 원하는 코드를 실행시키기 위
해서다 물론 우리가 원하는 실행코드란 쉘을 실행하는 코드일 것이다
공유 메모리에 데이터 읽고 쓰기
문제 파악
이번 레벨에서는 시스템 해킹 분야의 중요한 취약점에 초점을 맞춘다
포맷스트링 취약점
버퍼 오버플로우 취약점
소멸자를 이용한 실행 흐름 변경 취약점
결과를 보면 번째의 지정자에서 입력값이 나오는 것을 볼 수 있다
소멸자 역할을 수행하는 함수를 쉘코드로 흐름을 바꿀 수 있다면 쉘이 떨어진다는 의미가
된다
바이너리에 포함돼 있는 오브젝트의 심볼 목록을 볼 수 있는 명령어를 이용해 소멸자를
찾아보자
파일에 생성자에 해당하는 와 가 있고 소멸자에 해
당하는 라는 심볼이 있는 것을 볼 수 있다 아울러 소멸자의
주소가 각각 와 임을 알 수 있다
의도 분석
포맷스트링 버그는 복잡한 계산과 어려운 공격 원리 때문에 정확한 개념은 독학하기가 쉽지
않은 취약점이다 하지만 포맷스트링 버그가 있는 시스템이 발견된다면 공격의 파급효과가
너무 크기 때문에 반드시 알아야 할 주제이므로 이번 레벨에서 문제로 제출된 듯하다
배시셸을 실행시키는 셸코드
스택포인터 를 가져오는 함수
셸코드를 올릴 포인터 주소에 동적 메모리 할당
셸코드의 주소 읽어와서 화면에 출력
셸코드 실행 확률을 높이기 위해서 셸코드 앞에 충분한 추가
뒤에 셸코드 추가
배열의 끝을 명확히 알려주기 위해 문자열의 끝 표시
라는 환경변수명으로 셸코드를 환경 변수에 등록
새로운 배시셸 실행
에그쉘 코드를 컴파일해서 실행해 보면 환경변수에 올라간 쉘코드의 주소가 보인다 이제
이 주소를 에 덮어써 보자
공격
에그쉘 코드를 컴파일해서 실행해 보면 환경변수에 올라간 쉘코드의 주소가 보인다 이제
이 주소를 에 덮어써 보자
우리가 공격해야 할 주소는 소멸자가 있는 이고 덮어써야 할 쉘코드 주소는
에그쉘을 띄우면서 확인한 주소다 그러므로 에 있는 값을
으로 바꾸면 된다
지정자 개로 인해 포인터가 배열 바로 앞으로 이동
에서 입력된 지정자 때문에 포인터가 한 번 더 이동해서 배열을 가리
키게 됨
즉 타겟주소 에 해당하는 이 입력된 메모리 주소를 가리키게 됨
지정자에 의해 지금까지 입력된 바이트 바이트 바이트 를 모두
더한 바이트를 진수로 바꾼 이 에 저장됨
버퍼 오버플로우
개념
버퍼오버플로우 개념 정리
버퍼 변수에 데이터를 저장하기 위해 확보된 임시 메모리 공간 지역변수는 순서대로
변수의 크기에 해당하는 간격을 두고 스택에 쌓인다
함수는 스택 프레임이 구성되면서 지역변수 스택프레임 포인터 이전 함수의
베이스 포인터 인자수 인자값 환경변수의 선형 순서로 스택에 배치된다
버퍼 오버플로우 입력값의 크긱까 버퍼의 크기보다 큰지 경계 검사를 하지 않은 경
우 메모리에 확보된 버퍼의 크기를 초과해서 데이터가 저장되면서 버퍼 주변 공간
리턴 주소 등 까지 덮어씌워지는 이상 현상 취약점이 있는 소스코드를 보면 입력받
은 값에 대한 길이가 할당된 버퍼 크기를 넘지 않는지 경계 검사를 하지 않는 것이
취약점의 핵심이다
문제 파악
합계
월
월
월
월
취약점이 있는 바이너리인 와 힌트 파일인 파일이 있고 의 웹페이지가
있는 디렉터리와 공격을 위한 테스트 공간인 디렉토리가 있다
문장을 입력하세요
바이트 크기의 지역변수인 배열이 선언돼 있다
실행 파일 의 권한에 의 권한을 부여한다
문장을 입력하세요 라는 문자열을 출력한다
함수를 이용해 문자열을 입력받는다
입력받은 문자열을 출력하고 종료한다
의도 분석
메모리의 스택 구조를 정확하게 이해하고 버퍼를 오버플로우 시키는 기본 개념을 이해하고
있는지 묻고 있다
공격
문장을 입력하세요
문장을 입력하세요
세그멘테이션 오류
보다시피 바이트까지는 입력해도 정상적으로 처리된다 하지만 위와 같이 스택프레임포
인터나 리턴 주소를 덮어쓰게 되면 세그멘테이션 오류가 나면서 프로그램이 비정상적으로
종료되는 것을 확인할 수 있다
이러한 비정상 종료가 버퍼 오버플로우 취약점의 존재를 뜻하는 것이므로 앞에서 분석했던
방법으로 메모리에 쉘코드를 올려두고 이 쉘코드의 주소로 리턴주소를 덮어쓰는 식으로 공
격해 보자
문장을 입력하세요
핂
컞
汪!!! 己!
스택 가드
개념
버퍼 오버플로우를 이용하면 실행 흐름을 바꿔서 원하는 명령을 실행할 수 있는 중요한 취
약점이 있다는 것을 알았다 그런데 이러한 버퍼 오버플로우의 방어책으로 제시된 방법 중
하나가 바로 스택 가드 다
스택가드는 배열변수와 리턴 주소 사이테 스택 가드라고 하는 공간이 만들어져 있다
스택가드의 개념은 단순하다 레벨 에서와 같은 방법으로 버퍼 오버플로우시켜서 리턴 주
소를 변조하게 되면 당연히 스택 가등 영역도 함께 다른 값으로 변조될 수 밖에 없다 그러
므로 스택 가드에 저장돼 있는 값이 바뀌었다는 것은 버퍼 오버플로우 공격이 일어났다는
것을 의미하고 스택 가드의 변경이 확인되면 프로세스 실행을 차단해서 공격을 방어할 수
있다
문제 파악
소스 코드 흐름
타입의 변수 를 선언하고 값으로 초기화
입력값을 저장할 배열 선언
권한으로 프로세스가 실행되도록 설정
의 값이 인지 확인해서 변조됐으면 프로그램을 종
료
위의 예제 코드에는 스택가드가 변조됐을 때만 결과가 화면으로 출력되고 스택 가드가 변
조되지 않는 정상적인 상황에 처리하는 동작이 전혀 없다 그러므로 인자값을 전달했는데도
아무런 반응이 없는 것에 당황스러워 하지 않기를 바란다 소스코드에 있는대로 정상적으로
동작하는 것이다
의도 분석
현실 세계에서는 해킹 당하지 않는 완전히 안전한 시스템이란 없다 보안 취약점이 발견되
면 패치 버전이 배포되지만 시간이 지나면 또 다른 취약점이 발견되는 사이클을 거친다 이
에 따라 더욱 안전한 시스템을 만들기 위해 끊임없이 패치가 발표되고 해커는 또 다른 취약
점을 찾아내고 있다 이번 레벨에서는 스택 가드를 통해 이 같은 사이클을 보여주는 데 출제
의도가 있다고 볼 수 있다
공격
변조하면 안되는 스태 가드의 값
배시셸을 실행시키는 셸코드
배열의 시작 주소
스택가드 셸코드 리턴 주소의 길이 확인
셸코드 앞부분까지 썰매 할당
뒤에 셸코드 할당
나머지 공간에 썰매 할당
스택 가드의 원본 덮어 쓰기
나머지 공간에 썰매 할당
배시 셸코드의 주소 할당
루틴 분기 키값의 이해
개념
분기 루틴이란 특정 조건을 만족할 때 분기하는 루틴을 말하낟 분기 루틴의 대표적인 예로
소프트웨어를 설치할 때 시리얼키를 입력받아 입력값이 맞으면 프로그램의 모든 기능을 사
용할 수 있고 그렇지 않으면 제한된 기능만 사용할 수 있게 하는 것이 있다
어떻게 보면 이것은 스택 가드와도 비슷한 개념이라고 할 수 있다 즉 메모리에 저장돼 있
는 값을 정확하게 분석할 수 있는지를 묻는 아주 기본적인 문제로 볼 수 있다
문제 파악
레벨 이후로는 의 문제를 그대로 가져왔습니다
버퍼 오버플로우 포맷스트링을 학습하는데는 이 문제들이
최고의 효과를 가져다줍니다
소스코드 흐름
타입의 변수 선언
입력값을 저장할 배열 선언
키보드로 바이트까지 입력받음 리턴 주소까지 덮어쓰려면
바이트를 입력할 수 있어야 함 바이트만 입력받도록 제한해서 버퍼 오버플로우
취약점을 차단한
변수에 값이 있으면 블록을 실행
권한으로 프로세스가 실행되도록 설정
배시쉘 실행
변수를 선언한 부분을 보면 초기값을 설정하지 않았다 그러므로 임의의 쓰레기 값이
할당돼 있을 것이다 그렇다면 우리는 단순하게 변수에 값만 입력하면 되
는 것이다 쉘을 실행하는 코드가 이미 소스코드에 있으므로 오히려 버퍼 오버플로우보다는
쉬울 수 있다 이것은 도움부에서 설명한 바와 같이 쉐어웨어 소프트웨어를 정품으로 크랙
하는 패턴과도 일맥상통한다
의도 분석
이번 레벨은 단순한 버퍼 오버플로우 공격을 차단할 수 있는 할당된 배열 크기의 경계값을
체크하는 방법을 소개하고 있으며 버퍼 오버플로우가 아니더라도 개발자가 설정한 조건값
을 정확하게 분석한다면 프로그램을 다른 방식으로 동작하도록 변경할 수 있음을 보여준다
공격
변수 앞까지는 바이트의 문자로 채우고 변수에는 를 채움으로
써 구문을 참 으로 만들어 권한을 가진 배시쉘이 떨어지게
했다
루틴 분기 키값의 이해
개념
레벨 는 레벨 에서 풀이한 개념에서 포인터를 이용해 한 단계 더 꼬아둔 문제다 언어
를 공부한 모든 독자라면 포인터를 어려워 할 것이다 초보자 입장에서 보면 전혀 필요없는
개념이라고 오해할 수도 있다 개념적으로만 보면 메모리의 값을 바꾸는 것과 메모리에서
가리키는 주소의 값을 바꾸는 것은 큰 차이가 없는 것처럼 이해될 수 있다
문제 파악
소스코드 흐름
타입의 선언
입력값을 저장할 배열 선언
키보드로 바이트까지 입력받음 리턴 주소까지 덮어쓰려면
바이트를 입력할 수 있어야 함 바이트만 입력받도록 제한해서 버퍼 오버플로우
취약점을 차단함
포인터 변수가 를 가리키는지 확인
권한으로 프로세스가 실행되도록 설정
배쉬쉘 실행
포인터 변수를 선언한 부분을 보면 초기값을 설정하지 않았기 떄문에 당연히 임의의
쓰레기 값이 할당되어 메모리의 랜덤한 곳을 임의로 가리키고 있을 것이다
그러므로 레벨 와 같이 단순하게 포인터 변수에 값만을 입력해 주는
것이 아니라 포인터 변수에 있는 값이 가리키는 메모리 주소에 를 넣어야
만 권한의 배쉬셀이 실행될 것이다
이번 레벨에서는 정수 변수가 아닌 포인터 변수가 선언됐음을 다시 기억하길
바란다
의도 분석
개발할 때도 마찬가지지만 시스템 해킹에서는 항상 포인터 변수에 대해 충분히 고려해야 한
다
공격
배열 포인터 변수 앞에 입력할 값
배열 의 시작 주소
포인터 변수 앞에 값 입력
배열 의 시작 주소 입력
공격 명령어 생성
함수 포인터 변조
개념
이번 레벨에서는 앞의 레벨 와 레벨 에서 다룬 단순한 변수형의 포인터보다 더 어려운
함수 포인터와 관련된 문제가 출제된다
여기서는 함수의 시작 번지를 가지고 있는 포인터의 주소값을 다른 함수의 주소값으로 바꾸
면 다른 함수가 실행되는 공격도 가능하다는 것이 핵심이다 마찬가지로 다른 함수의 주소
가 아닌 쉘코드를 올려둔 주소로 번지를 바꾸면 쉘코드가 실행될 것이다
일 문제 파악
에서는 키보드로 바이트만큼 입력받도록 제한해서 버퍼 오버플로우
취약점을 차단하고 있다 하지만 리턴 주소까지 덮어쓰려면 바이트까지 입력할 수 있어야
한다
어셈블리 언어의 문법과 문법 비교
구분 명령어 포맷 명령어 예
명령어
명령어
두 문법은 사실 거의 동일하며 크게 다른 점은 명령어 이후의 출발 과 목적
인자가 뒤바뀐 점 정도다
의도 분석
이번 레벨은 배열과 포인터를 이용해 메모리 주소의 이동을 정확하게 이해할 수 있게 해준
다 힌트에서 제시된 소스코드는 지금까지와는 달리 상당히 복잡한 편이라서 정확한 의도를
팡가하기가 어려울 수 있다 하지만 배열과 포인터로 메모리 주소를 이동할 수 있다는 사실
을 정확하게 알고 있는 독자라면 복잡한 소스코드에서 문제의 핵심을 찾아낼 수 있을 것이
다
의도 분석
이번 장의 서두에서 언급한 것처럼 프로그램 내부에서 호출하는 함수를 다른 함수를 호출하
도록 흐름을 바꾸는 것은 시스템 해커에게 상당히 흥미로우면서도 유용한 공격 방법이다
공격
함수 포인터 변조
개념
레벨 은 레벨 에서 풀이했던 원리와 비슷한 개념이지만 레벨 에 있었던 함수가
없는 소스코드가 제공된다 그러므로 배쉬셀을 스스로 실행할 수 있는 쉘코드를 만들어 레
벨 과 동일하게 함수 포인터가 가리키는 주소를 변조해야 한다
문제 파악
참고로 레벨 에서와 마찬가지로 함수를 실행하는 부분에서는 키보드
로 입력받는 양을 바이트로 제한해서 버퍼 오버플로우 취약점을 차단했다 하지만 리턴
주소까지 덮어쓰려면 바이트까지 입력할 수 있어야 한다는 사실을 기억하자
보다시피 지역 변수의 공간으로 바이트가 확보된 것을 볼 수 있다 하지만 레벨
레벨 에서 분석한 경험을 바탕으로 바이트에 포함되는 지역 변수인 뱨
열의 사이에 끼어있는 더미 공간의 정확한 크기를 추측할 수 있을 것이다
의도 분석
이번 레벨은 버퍼 오버플로우에 대한 다양한 공격 패턴을 점진적으로 코드의 복잡성을 더해
가면서 이해할 수 있게 도와준다 독자들도 직접 실습할 수 있게 디버깅 과정을 간단하게 설
명하고 있으므로 로 메모리 구조를 살펴보는 데 익숙해질 때까지 연습하길 바란다
포인터가 복잡하고 어렵다는 인식을 갖고 있을 것이다 물론 실제로 복잡하기 떄문에 어렵
고 헷갈리는 것도 사실이다 하지만 포인터는 포인터일 뿐이라는 것을 명심하길 바란다
타입의 포인터 타입의 포인터 타입의 포인터 함수 포인터 등 다양한 포인터가
있지만 이 다양한 포인터는 모두 포인터일 뿐이다
즉 포인터가 가리키고 있는 메모리 주소에 저장된 값에 따라 포인터의 타입이 타입이나
타입과 같이 구분되지만 포인터는 함수를 이용해 크기를 확인하면 모두 바이
트 공간을 차지하는 변수일 뿐이다
공격
포인터 활용
개념
언어의 포인터를 이요해 프로그램을 만들어 본 사람이라면 포인터 연산자를 이용해 메모
리를 옮겨 다닐 수 있다는 사실을 알고 있을 것이다
문제 파악
지역변수의 공간으로 바잍트가 확보된 것을 볼 수 있다 변수도 많기 떄문에
메모리 구조를 확인해 볼 필요가 있다
공격
먼저 힌트에 제시된 소스코드의 동작 방식을 보면 이라는 값을 전달해야
배열의 인덱스를 바이트 감소시킬 수 있기 때문에 여기서는 진수인 을 입력
해야 한다 하지만 함수나 함수와 같이 인자값이 아닌 키보드 입력값을 따로
전달받는 경우에 진수값을 전달하려면 파이프를 통해야 한다 즉 다음과 같이 값을 그냥
입력할 경우에는 이라는 진수가 전달되는 것이 아니라 과 같이 개의
문자가 전달된다 따라서 반드시 스크립트를 통해 정확한 진수 값이 전달되게 해야 한다
공유 라이브러리를 이용한 버퍼 오버플로우
개념
버퍼 오버플로우를 차단하는 기법들도 많이 발표됐다
대표적으로 을 비롯해 입력
받는 문자열의 길이를 오버플로우되지 않도록 제한하는 등 다양한 대비책이
있다
하지만 해킹의 힘은 어떤 문제를 방어하기 위해 수립된 대책을 끊임없이 우회하는 방법을
찾는 데 있으므로 해커들은 지속적인 분석과 연구로 차단된 해킹 환경을 우회하는 방법을
계속해서 찾아내고 있다 그중 가장 대표적인 기법이 바로 공유라이브러리를 이용한 버퍼
오버플로우 기법인 공유 라이브러리로의 복귀 다 이 기법 역시 알고 나면 이
해하기가 어렵지 않지만 이 기법을 처음 생각해 낸 사람의 노력은 인정해야 한다
문제 파악
바이트를 입력받아 화면에 출력하는 것이 의도겠지만 입력 문자열의 크기를 검사하지 않
으므로 버퍼 오버플로우 취약점이 있다
지역변수의 공간으로 바이트가 확보된 것을 볼 수 있다
배시셸을 실행시키는 셸코드
스택포인터 를 가져오는 함수
셸코드를 올릴 포인터 주소에 동적 메모리 할당
셸코드의 주소 읽어와서 화면에 출력
셸코드 실행 확률을 높이기 위해서 셸코드 앞에 충분한 추가
뒤에 셸코드 추가
배열의 끝을 명확히 알려주기 위해 문자열의 끝 표시
라는 환경변수명으로 셸코드를 환경 변수에 등록
새로운 배시셸 실행
부분이 추가된
부분이다 이렇게 되면 쉘코드가 실행될 때 의 권한으로 배시쉘이 실행되게 하므로
의 권한으로 배시쉘을 얻을 수 있다
의도 분석
함수가 프로그램을 실행할 떄 어떤 영향을 미치는지 정확하게 이해할 수 있었을
것이다 마치 리눅스 시스템에서 와 설정을 주는 것과 같은 개념이라고 생각해도
될 것이므로 가볍게 이해하길 바란다 그리고 공유 라이브러리로의 복귀 공격과 같은 버퍼
오버플로우 공격의 응용은 약간 복잡할 수는 있지만 좀 더 다양한 공격의 가능성을 제공하
는 기법이므로 알아두는 것이 좋다
포맷스트링 복습
문제 파악
소스코드 흐름
키보드로 입력받은 배열을 선언
권한을 실행 파일에 부여
키보드로 바이트만큼 입력받음 입력값에 대한 경계 검사를 하고 있기 때문에 버퍼
오버플로우로 스택프레임의 리턴 주소를 덮어 쓸 수 없다
입력받은 문자열 출력
자세히 보면 이번 레벨에서는 함수가 있기 떄문에 공격에만 성공하면
쉽게 다음 레벨의 배시쉘을 얻을 수 있을 것이다
키보드로 입력받는 부분 떄문에 이번 레벨에서는 함수의 리턴
주소를 덮어쓸 수 없을 것이다
디버깅이 되지 않는 것을 확인할 수 있다
보다시피 레벨 과 동일하게 네번째에 입력 문자열이 표시되는 것을 볼 수 있다 그럼 이번
에는 덮어써야 할 의 주소를 확인해 보자
출력 결과를 보면 프로그램을 이용해서는 메모리에 올라온 심볼들이 보이지 않는다 심
볼 분석이 되지 않도록 컴파일하면 이와 같이 바이너리에 있는 많은 정보를 숨겨서 쉽게 리
버싱하지 못하게 할 수 있다 하지만 를 이용하면 다음과 같이 메모리에 올라온 심
볼의 위치를 확인할 수 있다
출력 결과에서 번째로 출력된 에서 의 주소가 임을
알 수 있다 하지만 레벨 에서 언급한 바와 같이 다음 바이트만큼 떨어진 주소인
심볼을 덮어써야 하므로 우리가 덮어써야 할 대상 주소는 에 해
당한다
의도 분석
디버깅이 차단된 환경에서 포맷스트링 관련 문제가 제시됐다
공격
참고 자료
문제 풀이로 배우는 시스템 해킹 테크닉
각종 인터넷 해커스쿨 풀이집

More Related Content

Viewers also liked

초보자를 위한 시스템 해킹 공부 가이드라인
초보자를 위한 시스템 해킹 공부 가이드라인초보자를 위한 시스템 해킹 공부 가이드라인
초보자를 위한 시스템 해킹 공부 가이드라인H4C
 
Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]sweetchip
 
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KOGangSeok Lee
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipsweetchip
 
[2014 CodeEngn Conference 10] 심준보 - 급전이 필요합니다
[2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다[2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다
[2014 CodeEngn Conference 10] 심준보 - 급전이 필요합니다GangSeok Lee
 
시스템 보안에 대해 최종본
시스템 보안에 대해   최종본시스템 보안에 대해   최종본
시스템 보안에 대해 최종본승표 홍
 
무료강의 보안전문가의 길(2015년) v0.9_공개버전
무료강의 보안전문가의 길(2015년) v0.9_공개버전무료강의 보안전문가의 길(2015년) v0.9_공개버전
무료강의 보안전문가의 길(2015년) v0.9_공개버전James (SeokHun) Hwang
 
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016Taehoon Kim
 
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016Taehoon Kim
 
해킹 대회 리뷰 및 실전 해킹
해킹 대회 리뷰 및 실전 해킹해킹 대회 리뷰 및 실전 해킹
해킹 대회 리뷰 및 실전 해킹totodeung
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016Taehoon Kim
 

Viewers also liked (11)

초보자를 위한 시스템 해킹 공부 가이드라인
초보자를 위한 시스템 해킹 공부 가이드라인초보자를 위한 시스템 해킹 공부 가이드라인
초보자를 위한 시스템 해킹 공부 가이드라인
 
Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]
 
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO
[2014 CodeEngn Conference 11] 박세한 - IE 1DAY Case Study KO
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchip
 
[2014 CodeEngn Conference 10] 심준보 - 급전이 필요합니다
[2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다[2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다
[2014 CodeEngn Conference 10] 심준보 - 급전이 필요합니다
 
시스템 보안에 대해 최종본
시스템 보안에 대해   최종본시스템 보안에 대해   최종본
시스템 보안에 대해 최종본
 
무료강의 보안전문가의 길(2015년) v0.9_공개버전
무료강의 보안전문가의 길(2015년) v0.9_공개버전무료강의 보안전문가의 길(2015년) v0.9_공개버전
무료강의 보안전문가의 길(2015년) v0.9_공개버전
 
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016
지적 대화를 위한 깊고 넓은 딥러닝 PyCon APAC 2016
 
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016
텐서플로우 설치도 했고 튜토리얼도 봤고 기초 예제도 짜봤다면 TensorFlow KR Meetup 2016
 
해킹 대회 리뷰 및 실전 해킹
해킹 대회 리뷰 및 실전 해킹해킹 대회 리뷰 및 실전 해킹
해킹 대회 리뷰 및 실전 해킹
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
 

Similar to Hackerschool FTZ 문제 풀이

『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1Jinkyoung Kim
 
셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영Nalee Jang
 
Linux programming study
Linux programming studyLinux programming study
Linux programming studyYunseok Lee
 
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1Park Jonggun
 
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기Jinkyoung Kim
 
Du room system_portfolio
Du room system_portfolioDu room system_portfolio
Du room system_portfolio진영 최
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기KwangSeob Jeong
 
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발동현 김
 
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)NAVER D2
 
타입스크립트 잘 사용하기
타입스크립트 잘 사용하기타입스크립트 잘 사용하기
타입스크립트 잘 사용하기SanghoYun
 
Why OpenStack is Operating System?
Why OpenStack is Operating System?Why OpenStack is Operating System?
Why OpenStack is Operating System?유명환 FunFun Yoo
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3형석 김
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
실용주의 프로그래머를 위한 개발환경 만들기
실용주의 프로그래머를 위한 개발환경 만들기실용주의 프로그래머를 위한 개발환경 만들기
실용주의 프로그래머를 위한 개발환경 만들기Mickey SJ Lee
 
Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis병준 김
 

Similar to Hackerschool FTZ 문제 풀이 (20)

『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
 
셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영
 
Linux programming study
Linux programming studyLinux programming study
Linux programming study
 
피니엔진
피니엔진피니엔진
피니엔진
 
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1
 
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
 
Du room system_portfolio
Du room system_portfolioDu room system_portfolio
Du room system_portfolio
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기
 
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
 
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
 
타입스크립트 잘 사용하기
타입스크립트 잘 사용하기타입스크립트 잘 사용하기
타입스크립트 잘 사용하기
 
Why OpenStack is Operating System?
Why OpenStack is Operating System?Why OpenStack is Operating System?
Why OpenStack is Operating System?
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
실용주의 프로그래머를 위한 개발환경 만들기
실용주의 프로그래머를 위한 개발환경 만들기실용주의 프로그래머를 위한 개발환경 만들기
실용주의 프로그래머를 위한 개발환경 만들기
 
Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis
 

Hackerschool FTZ 문제 풀이

  • 1. BEST OF THE BEST - HACKERSCHOOL FTZ by (re4lfl0w) Date: 13. 7. 14.
  • 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. 함수의 위험성 문제 파악 함수는 시스템에 명령을 실행할 때 사용하는 함수다 프로그램을 개발하는 데 반드 시 필요한 함수다 마이크로소프트 워드에서 현재 날짜를 입력하는 기능이 있다 이 기능도 시스템에서 함수를 이용해 날짜를 읽어와서 날짜 포맷을 선택할 수 있게 한 다음 출력하는 기 능에 불과하다 먼저 파일을 열어 문제의 실마리를 파악해 보자 다음 코드는 의 소스이다
  • 31. 이를 이용하여 의 권한을 얻어라 동시에 여러 명령어를 사용하려면 문자열 형태로 명령어를 전달하려면 는 과 동일하게 도메인의 주소를 확인하는 프로그램이지만 기본적으로 유닉 스 계열 운영체제에 탑재돼 있다
  • 32. 과의 차이점은 쿼리할 서버의 옵션을 명령어를 사용할 때 입력해야 한 다는 점이다 타입의 배열 선언 인자가 개 입력되지 않으면 에러 출력 하고 프로그램을 종료 입력받은 주소 문자열 완성 명령어 마지막에 옵션을 추가 위에서 조합된 명령어 실행 프로그램 흐름 먼저 라는 문자열을 배열에 넣는다 문자열 뒤에 명령어 다음에 입력된 문자열을 붙인다
  • 33. 입력받은 문자열 뒤에 라는 문자열을 붙인다 가령 이라는 주소를 입력하면 라는 명령어 문자열이 조합된다 즉 명령은 결국 입력받은 문자열에 해당하는 서버에서 운영중인 프로그 램의 버전을 확인하는 명령을 실행한다 이는 해당 서버에서 취약한 버전을 운영 중인지 확 인할 수 있는 유용한 명령이다 하지만 요즘에는 설정에서 이와 같은 버전 요청에 대 해 회신하지 않도록 설정하고 있으므로 취약한 서버가 아니라면 버전에 대한 회 신이 없을 것이다 문제 분석 공격 대상 파일 찾기 먼저 레벨 문제에 해당하는 취약한 파일을 찾는 방법으로는 가지가 있다 즉 라 는 파일명을 알고 있으므로 파일명으로 검색할 수도 있고 레벨 이나 레벨 에서 했던 것과 같이 파일의 권한으로 찾을 수 있다 파일명으로 를 이용해 찾는다 월 다음 레벨의 계정인 의 권한으로 가 설정돼 있고 의 권한으로 가 설정된 파일을 찾는 방법이다 월 리버싱을 통한 의사 코드 복원
  • 35. 프로그램 실행 흐름 스택을 구성한다 의 값이 인지 검사해 가 아니면 에러 메시지를 출력하고 프로그램을 종료한 다 여기서 가 라는 의미는 명령어 개와 인자 개를 의미한다 의 값이 이면 입력받은 문자열 형태의 명령을 만들어 실행한다 를 번 스택에 올리고 함수를 호출한다 즉 라는 코드가 실행되어 를 실행하는 동안 가 되게 만든다
  • 36. 끝으로 지금까지 조합된 문자열인 의 주소를 스 택에 올리고 함수를 호출한다 즉 라는 코드가 실행되면서 에 대한 프로그램의 버전을 조회한다 복원된 소스코드 원본 소스와 비교하면 문자열을 저장하는 배열의 배열 크기와 배열명 정도의 차이 만 있을 뿐 소스코드의 흐름에는 크게 차이가 없다는 사실을 알 수 있다 물론 배열 크기도 치밀하게 계산하면 추측할 수 있지만 흐름상 크게 지장이 없으므로 신경쓰지 않아도 된다 이처럼 컴파일러가 컴파일하는 과정을 정확하게 이해하면 컴파일러에 의해 만들어진 어셈 블리어 코드를 가지고도 거의 정확한 원본 소스코드를 만들어 낼 수 있다
  • 37. 의도 분석 함수에 여러 개의 명령을 실행할 수 있게 문자열을 전달하는 방법을 이해하고 직접 그렇게 할 수 있어야 한다는 점이 중요하다 공격 이 실행파일에 어떤 취약점이 있다는 것인지 힌트를 다시 보면서 고민해 보자 동시에 여러 명령어를 사용하려면 문자열 형태로 명령어를 전달하려면 첫번째 힌트인 동시에 여러 명령어를 사용하려면 이라는 힌트는 함수에서 이러 한 기능을 실행해본 적이 없다면 이해하기가 쉽지 않다 하지만 리눅스 쉘에서 문자열을 어 떻게 전달하는지를 잘 생각해 보면 의외로 쉽게 풀 수 있다
  • 38.
  • 39. 첫번째에서는 번째 인자인 가 제대로 전달되지 않는다 이것은 소스코드를 보면 알겠지만 에 첫번째 인자만 처리하기 때문이다 그러므로 두 번째 인자를 전달 할 수 없다 그래서 명령어 사용법이 틀린 것이고 명령어 사용법을 알려주는 에러 메시지가 출력되는 것이다 그렇다면 어떻게 과 을 하나의 인자로 전달할 수 있을까 유닉 스 계열의 쉘에 익숙한 독자라면 추측할 수 있을 법한 방법인 문자열 형식의 입력을 이용하 는 것이다 쌍따옴표를 이용해 인자값 개를 하나로 묶어줌으로써 프로그램에 하나의 인자를 전달한 것처럼 할 수 있다 여기서 또 한 가지 힌트는 과 같은 명령어의 입력값을 전달하는 것이 아 니라 유닉스 계열 서버에서 실제로 실행될 수 있는 명령어를 연속해서 전달하려면 을 이 용하면 된다 은 쉘에서 명령어를 한 줄에 연속해서 적을 때 이용할 수 있으며 이는 함수에도 동일하게 적용된다
  • 40. 초기 명령어는 이지만 를 통과해서 시스템에서 실행 되는 명령어는 다 그러면 명 령어는 아래와 같은 순서대로 실행된다 과 는 이해가 된다 같은 경우는 라는 명령어에 개의 인자로 와 가 전달되는 상황이다 그러므로 위 실행 결과의 마지막 줄에서 라는 명령어가 없다는 에러 메시지가 출력된다 이제 어떤 명령어를 실행해야 할지 추측할 수 있을 것이다
  • 41. 우리가 의도한 대로 명령이 정확하게 실행되어 다음 레벨인 계정의 패스워 드가 출력된 것을 볼 수 있다 하지만 깔끔하게 해킹했다고 할 수가 없다
  • 42.
  • 43. 가 실행되는 순간에 의 권한으로 쉘이 실행되면서 의 권한이 유지된 모 습을 볼 수 있다 이로써 훨씬 더 완전한 형태의 해킹에 성공했다 월
  • 44. 월 하지만 이 파일을 실행하더라도 모든 권한이 이다 이는 를 설정하지 않았기 떄문 이므로 에 대한 추가 설정을 해줘야 한다 월 를 추가하고 적용된 것을 확인한 후 해당 파일을 실행하면 계정의 사용자 권 한으로 쉘이 실행됐다 백도어의 유용성을 한 번 더 확인해 보자
  • 45. 로 로그인해서 실행해도 권한으로 쉘이 실행된다 으로 로그인해야만 권한을 얻을 수 있는 한계마저 뛰어 넘었다 이것이 백도어의 매력이다 이러한 특성 때문에 해킹당한 서버나 에는 끊임없이 백도어가 설치되는 것이다
  • 46. 백도어 문제 파악 레벨 에서는 로컬 백도워를 배웠다 하지만 로컬 백도어보다는 당연히 원격 백도어가 훨씬 공격자에게는 편리한 백도어다 이번 문제는 서버 운영체제 해킹에 해당하는 영역이므로 데몬의 개념을 알아야만 풀 수 있으므로 먼저 리눅스 시스템의 부팅 순서를 알아보자 부트 로더 실행 커널 이미지 메모리 로딩 파일에 있는 내용 중 선택된 모드로 프로세스 실행 데몬에 의한 네트워크 데몬 가동 부팅 완료 먼저 파일을 열어 문제 해결을 위한 실마리를 찾아보자 누군가 에 백도어를 심어놓았다 로컬 백도어와 포트 백도어로 용어에 차이를 두는 것은 백도어를 이용하는 곳이 로컬 시스 템인지 아니면 네트워크를 통한 원격인지의 차이일 뿐이며 인증가 인가를 우회해서 신원 확인을 거치지 않은 채로 로그인하겠다는 목적은 동일하다 문제 분석 합계 월 월 월 월
  • 47. 월 월 월 월 월 월 월 월 월 월 월 월 월 월 월 월 가장 중요한 부분은 계정의 권한으로 라는 서비스를 이용해 파일이 실행된다는 것이다
  • 48. 보다시피 서비스가 사용하는 포트가 임을 알 수 있다 따라서 공격할 때 번 포트로 접속을 시도하면 된다 여기서 포트로 접속을 시도하면 된다는 말은 서버 에 포트가 으로 나타나야 한다는 의미다
  • 49. 포트가 열려 있음을 알 수 있다 그런 파일이나 디렉토리가 없음 데몬을 시작하기 위한 설정 파일이 없으므로 네트워크 백도어가 제대로 구동되지 않는다 현재의 환경을 파악하기 위해 포트로 접속해 보면 파일 이 없기 때문에 아무런 실행 결과가 나타나지 않는다 의도 분석 백도어는 실행한느 위치에 따라서 로컬 백도어와 원격 백도어로 분류할 수 있다 용어에서 도 짐작할 수 있겠지만 로컬 백도어보다는 원격 백도어가 공격자에게는 훨씬 유용하다 어 플리케이션의 취약점을 이용해서 원격에서 강제로 실행 흐름을 바꾸는 원격 익스플로잇이 여러분의 목표가 되어야 하겠으나 지금 단계에서는 리눅스 운영체제의 설정을 이용한 기본 적인 원격 백도어라 할 수 있는 포트 백도어를 제시함으로써 여러분에게 원격 백도어의 유 용성을 소개하고 있다 공격 파일을 열어보고 명령 실행 파일을 열어보고 로그인한 계정을 확인하는 명령어까지 실행하도록 작성했다
  • 50. 누군가 에 백도어를 심어놓았다 권한으로 정확하게 실행된다는 것을 알 수 있다 계정의 패스워드 확인 암호가 원래 나와야 되는데 깨져서 나오지 않는다 배시쉘 실행 완벽한 쉘을 얻기 위해 배시쉘 실행 보다시피 서버와 연결이 된 것처럼 보이지만 입력한 명령에 대한 출력 결과가 보이지 않는 것으로 봐서 쉘이 제대로 실행되지 않음을 확인할 수 있다 서버에서는 와 같은 원격 접속용 프로그램이 지원되지 않으므로 각 자의 에서 원격으로 아래와 같이 접속해 보자
  • 51.
  • 52. 레이스 컨디션 개념 에 대한 문제로서 취약점과 공격 방법에 대한 개념을 정확하게 이해하지 않 고서는 풀 수 없을 정도로 어려운 문제다 경쟁상태란 다수의 프로세스가 서로 동일한 자원 을 할당받기 위해 경쟁하는 상태를 말한다 물론 경쟁 상태에 빠진 다수의 프로세스에게서 발생할 수 있는 최악의 상황 중 하나는 역시 즉 교착상태다 경쟁 상태가 일어나는 상황 중에서 중용한 정보가 담긴 파일의 소유를 경쟁할 수 있는 상황 이 예제로 제시돼 있다 다른 계정의 권한에 접근해야 하므로 가 걸려 있어야 한다 임시 파일을 생성해야 한다 공격자가 임시로 생성되는 파일을 정확하게 알아야 한다 레이스 컨디션 환경에 대해 간단히 설명한다 임시 파일의 생성을 시도 임시 파일이 생성되면 내용을 쓰고 바로 파일을 삭제 공격자 입장에서는 임시 파일 에 내용을 쓰고 삭제하는 순간이 너무 짧은 것이 문제다 임시 파일의 생성에 실패하면 프로그램을 종료 다시 정리하자면 파일 생성 파일 생성에 성공하면 생성된 파일에 내용 쓰기 쓴 내용을 읽어들여 처리 사용 파일 삭제 구체적으로는 번과 번 사이에 취약점이 존재하게 된다 공격할 수 있는 틈이 있긴 하지만 너무 짧은 시간 간격이라서 결국 공격용 프로그램을 작성해야 한다는 것이다 프로그램을 작성해 보면 알겠지만 프로그램으로 공격해도 타이밍을 맞추기 어려운 짧은 시간 간격이라 서 결국 타이밍이 맞는 순간까지 집요하게 프로그램을 반복해서 실행해야 한다는 사실을 알 게 될 것이다 진행 흐름을 다시 한 번 정리해 보자
  • 53. 공격 프로세스에서 파일을 만든다 공격 프로세스에서 파일을 원본으로 하는 링크 파 일을 만든다 링크가 취약한 프로세스가 생성하고 삭제하는 파일의 이름이다 레이스 컨디션 취약점이 있는 프로세스를 시작한다 취약한 프로세스가 파일을 생성하려고 하지만 공격 프로세스가 만 들어 둔 링크인 파일이 이미 있으므로 추가로 파일을 만들지 않는 다 취약한 프로세스가 링크에 내용을 쓴다 링크에 내 용을 쓰면 원본인 파일에 내용이 쓰여진다 취약한 프로세스가 쓴 내용을 사용한 뒤 파일을 삭제하고 종료한다 결국 내용이 쓰여진 파일이 남아 있으므로 쓴 내용을 볼 수 있다 키보드 입력을 시도하거나 공격 코드를 짜서 시도해 보면 알겠지만 위의 순서에서 공격 프 로세스가 해야 하는 번과 번 과정을 취약한 프로세스가 번 과정을 거치기 직전에 수행해 야만 위의 순서대로 공격에 성공할 수 있다 문제 파악 프로그램은 디렉토리에 라는 이름의 임시파일을 생성한다 이를 이용하여 의 권한을 얻어라 그런 파일이나 디렉토리가 없음 문제 분석 리버싱을 통한 의사코드 복원
  • 54.
  • 55. 실행 흐름 정리 스택을 구성한다 함수로 파일을 만든다 파일 생성에 성공하면 라인으로 가고 실패하면 다음 라인으로 간다 파일 생성 실패 메시지를 출력한다 생성 시도한 파일을 삭제한다 프로세스를 종료한다 에서 파일 생성에 성공한 경우 대상 파일에 문자열을 쓴다 대상 파일을 삭제한다 언어로 정리하자면 파일생성 실패시의 처리 파일생성 성공시의 처리 복원된 소스코드
  • 56. 임시 파일 생성 임시 파일 생성에 실패하면 에러 메시지 출력 파일 삭제 후 종료 파일 삭제 임시 파일 생성에 성공하면 파일에 문자열을 쓰고 파일 삭제 여기석 공격 포인트는 부분이 된다 프로세스에서 임시 파일을 생성하기 직전에 공격 프로그램에서 임시 파일에 먼저 링크를 걸게 되면 링크를 건 파일을 통해 미리 만들어 둔 파일에 로 패스워드를 적 게 하는 것이다 이처럼 파일에 쓰여지는 내용이 의 패스워드 이므로 레이스 컨디션을 이용한 공격에 성공하기만 하면 된다 그래서 이전 레벨과 달리 의 권한으로 가 설정되지 않은 이유를 이해할 수 있다 의도 분석 레이스 컨디션의 정확한 개념을 이해하고 파일 생성 시점에서 우선순위를 선점해 공격 대 상 프로세스보다 먼저 파일을 만들고 링크를 걸 수 있는지를 확인하는 문제다
  • 57. 공격 공격 코드에서 염두에 둘 부분은 타이밍을 빼앗을 수 있는 순간을 만들어 내기 위해 취약한 프로그램과 공격 프로그램을 여러 차례 반복해서 실행해야 한다는 것이다 취약한 바이너리의 반복 실행 레이스컨디션 익스플로잇
  • 58. 파일이 존재합니다 파일이 존재합니다 파일이 존재합니다 파일이 존재합니다 파일이 존재합니다 파일이 존재합니다 파일이 존재합니다
  • 59. 시스템 인터럽트의 위험성 개념 시스템 인터럽트는 프로세스 간에 주고받는 신호로서 시스템 개발에서는 중요한 요소다 이 번 레벨에서는 이 같은 시스템 인터럽트를 이용해 시스템의 취약점을 발견하고 이를 이용하 는 것이 핵심이다 인터럽트 종류
  • 60. 문제 파악 인포샵 의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다 텔넷 접속 서비스 하이텔 나우누리 천리안 접속하고 싶은 를 선택하세요 안내 화면에서 습관적으로 엔터를 입력하자 다음과 같이 유닉스나 운영체제 사용자에 게 익숙할 법한 사용자 메뉴가 나온다 텔넷 접속 서비스 하이텔 나우누리 천리안 접속하고 싶은 를 선택하세요 우리가 많이 사용하는 시그널은 이미 차단돼 있었고 나 와 같은 프로세스를 종료시키는 시그널만 실행되어 수없이 재로그인을 해야만 했다
  • 61. 문제 분석 리버싱을 통한 의사 코드 복원
  • 62.
  • 64. 스택을 구성한다 함수를 실행한다 함수를 실행해 문자를 하나 입력 받는다 함수를 실행한다 함수로 많은 문자열을 출력한다 함수로 시그널을 처리한다 함수로 단어를 입력받는다 함수를 실행한다 함수로 문자열을 출력한다 복원된 소스코드 털넷 접속 서비스 하이텔 나우누리 천리안
  • 65. 시그널이 메뉴 출력 다음에 처 리된다 각종 시그널을 무시한다 접속하고 싶은 를 선택하세요 잘못 입력하셨습니다 접속을 종료합니다 메뉴를 선택하는 화면 다음에 시그널을 설정한다 그래서 메뉴 화면에서만 시그널이 시스템으로 전달되고 나머지 시그널은 무시된다 단 시그널을 입력하면 프로그램이 종료되면서 세션이 끊긴다 의도 분석 하나의 프로세스 프로그램 단위에서 함수 간에 서로 값을 주고받는 방법으로 인자와 리턴 값이 있다 프로그램 내에서 값을 공유할 필요가 있는 것과 마찬가지로 규모가 큰 프로젝트 를 진행할 때는 다른 프로그램 다른 프로세스와도 값을 주고받을 필요가 생긴다 그렇다면 프로세스 간에는 어떻게 인자를 전달할 수 있을까 가장 대표적인 방법이 네트워크 통신 파일 환경설정 텍스트 등 데이터베이스 등 다양한 방법이 있지만 지 금처럼 하드웨어와 네트워크 환경이 급격히 좋아지기 전까지는 이번 레벨에서 소개한 인터 럽트를 많이 이용했다 물론 인터럽트는 네트워크 통신이나 파일 및 데이터베이스처 럼 여러분이 알고 있는 함수 간에 값을 주고받는 것처럼 많은 데이터를 자연스럽게 주고 받 을 수는 없다 이번 레벨을 풀려면 지금까지 분석한 시그널 처리에서 시점의 중요성과 함께 서버의 계정 로그인과 관련된 환경설정까지 알아야 한다
  • 66. 공격 인포샵 의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다 프로그램이 실행되자마자 처음으로 만나게 되는 힌트 화면에서 를 눌러 프로그램 의 흐름을 막아 버리면 다음과 같이 의 쉘이 나타난다 합계 월 월 월 월 월 월 월 한 가지 눈여겨봐야 할 부분은 파일과 파일의 가 라는 점이다 이는 쉘 을 획득한 사용자가 파일을 삭제하거나 수정해서 다른 도전자의 문제 풀이에 영향을 줄 수 없게 한 안전 조치이니 참고하기 바란다
  • 67. 암호화의 시작 개념 반드시 알아야 할 것은 암호화 알고리즘 암호문 평문 이다 아스키 테이블 문제 파악 명령을 실행하면 패스워드 입력을 요청한다 패스워드는 가까운곳에 상상력을 총동원하라 진수를 진수를 바꿀 수 있는가 계산기 설정을 공학용으로 바꾸어라
  • 70. 스택을 구성한다 함수로 메모리 공간을 할당한다 함수로 문자열을 출력한다 함수로 문자열을 입력받는다 함수로 에서 입력받은 문자열을 비교한다 번 과정의 비교 결과를 검사한다 함수로 문자열을 출력하고 프로세스를 종료한다 함수로 명령어를 실행한다 복원된 소스코드 입력받은 문자열의 앞자리 자만 체크한다 디버깅에서는 없었지만 습관적으로 해제해 주는 것이 좋다
  • 71. 의도 분석 진수와 진수의 관계를 알고 있어야 하고 진수 진수 진수가 아스키 코드와 어떤 관계를 맺고 있는지 알아야 한다 특히 진수와 아스키 코드와의 연관 관계를 정확하게 알 아야 하고 아시크 테이블을 이용할 수 있어야 한다 공격 맨 앞 바이트만 비교하기 때문에 뒤에 더 많은 문자열을 입력하여도 통과한다
  • 72. 리눅스 패스워드 파일 크랙 개념 리눅스의 패스워드 체계에 관해 묻는 문제다 초기의 리눅스에서는 파일에 평문 형태로 패스워드를 표기했으나 패스워드를 아무나 보면 안된다는 보안 의식이 생기면서 지금처럼 모든 계정이 읽을 수 있는 에 있는 패스워드 부분은 로 가려져 있고 실제로 암호화한 패스워드는 계정만 읽을 수 있는 권한이 부여된 에 저장된다 그러므로 암호화 패스워드를 훔쳤다 는 건 시스템의 권한을 획득했다는 의미가 된다 월 월 리눅스의 패스워드는 파일에 단방향 암호화 알고리즘인 해쉬 암호화 알고리즘 으로 암호화해서 저장한다 단방향 알고리즘을 쓰는 이유는 평문 패스워드로 복호화할 수 없도록 하기 위해서다 단방향 해쉬 알고리즘으로 암호화된 패스워드의 원본인 평문 패스워드는 일반적으로 사전 대입법이나 기법을 사용한다 문제 파악 의 파일이 서버 어딘가에 숨어있다 그 파일에 대해 알려진 것은 용량이 이라는 것 뿐이다 월
  • 73. 월 월 월 바이트 단위로 검색하자 파일명부터 의심스러운 라는 파일이 검색된다 이로써 힌 트에서 제시된 은 바이트 단위임을 알 수 있고 다른 계정이 수정하지 못하도록 가 로 지정돼 있고 계정만 읽을 수 있도록 권한이 설정돼 있음을 확인할 수 있다 중 시스템 해킹을 공부할 때는 운영체제의 동작 원리는 물론 운영체제를 관리하는 방법까지 알 아두면 더 유리하다는 사실을 알아두기 바란다 의도 분석 이번 레벨에서는 명령어의 옵션을 알고 있는지와 시스템의 패스워들르 크랙할 수 있는지 묻고 있다 털넷 서비스가 돌고 있는 상황이므로 원격에서 크랙하는 것도 가능하다 하지만 일반적으로 원격 브루트포스 방식은 서버나 네트워크 관제실에서 방어하고 있기 때문에 크랙에 성공하 기가 쉽지 않다 반명 사람들이 많이 사용하는 단어를 정리해서 그 단어를 기반으로 패스워 드와의 일치 여부를 확인하는 딕셔너리 공격 기법 정도가 무난할 것이다 공격
  • 74. 딕서녀리 공격에 성공하는데 초가 걸렸다 공격 조건을 보면 단순 알파벳에 불과하다 이것을 검색하는데 초가 걸렸고 숫자나 특수문자까지 조건으로 추가하면 훨씬 더 많이 걸릴 것이다
  • 75. 버퍼 오버플로우 입문 개념 앞으로 출제되는 문제를 푸는 데 필요한 버퍼 오버플로우 기법을 이해하기 위해 메모리의 값을 조작하는 방법을 설명한다 시스템 해커가 되고자 한다면 실제 메모리의 구조를 꼭 이해해야 한다 문제 파악 버퍼 오버플로우 공격을 시작하기 위해 지역변수가 스택에 배치되는 순서와 위치를 정확하 게 알 수 있게 하는 준비 과정으로 이해하면 된다 차이가 나는 것을 확인할 수 있다 라는 문자열을 출력 배열에 바이트만큼 키보드 입력을 받음 배열의 문자열이 인지 확인 배열의 문자열이 이면 을 출ㄹㅕㄱ 실행될 프로세스의 유효 를 즉 으로 설정 실행 그러므로 의 로 배쉬셀을 실행 위의 순서를 보면 배열을 오버플로우시켜 배열에 라는 문자열만 넣으면
  • 76. 권한의 쉘이 나타나고 를 통과하게 된다 의도 분석 버퍼 오버플로우를 비롯한 각종 시스템 해킹에 포함되는 공격 기법은 결국 특정 값을 원하 는 메모리에 쓸 수 있는가 가 핵시ㅁ이다 그렇기 때문에 이후 레벨에서 소개할 공격의 개 념을 정확하게 이해할 수 있게 이번 레벨에서는 라는 임의 문자열을 배열에 쓰는 방법을 묻고 있다 공격 월 명령을 이용해 권한으로 가 설정된 파일을 찾는다
  • 77.
  • 78. 이번 레벨에서는 배열의 크기보다 큰 데이터를 입력함으로써 우리가 원하는 데이터를 특정 위치에 강제로 입력할 수 있다는 점을 알아야 한다 이러한 내용을 공부하는 궁극적인 이유 는 리턴 주소 를 우리가 원하는 주소로 덮어써서 우리가 원하는 코드를 실행시키기 위 해서다 물론 우리가 원하는 실행코드란 쉘을 실행하는 코드일 것이다
  • 79. 공유 메모리에 데이터 읽고 쓰기 문제 파악 이번 레벨에서는 시스템 해킹 분야의 중요한 취약점에 초점을 맞춘다 포맷스트링 취약점 버퍼 오버플로우 취약점 소멸자를 이용한 실행 흐름 변경 취약점 결과를 보면 번째의 지정자에서 입력값이 나오는 것을 볼 수 있다 소멸자 역할을 수행하는 함수를 쉘코드로 흐름을 바꿀 수 있다면 쉘이 떨어진다는 의미가 된다
  • 80. 바이너리에 포함돼 있는 오브젝트의 심볼 목록을 볼 수 있는 명령어를 이용해 소멸자를 찾아보자 파일에 생성자에 해당하는 와 가 있고 소멸자에 해 당하는 라는 심볼이 있는 것을 볼 수 있다 아울러 소멸자의 주소가 각각 와 임을 알 수 있다 의도 분석 포맷스트링 버그는 복잡한 계산과 어려운 공격 원리 때문에 정확한 개념은 독학하기가 쉽지 않은 취약점이다 하지만 포맷스트링 버그가 있는 시스템이 발견된다면 공격의 파급효과가 너무 크기 때문에 반드시 알아야 할 주제이므로 이번 레벨에서 문제로 제출된 듯하다 배시셸을 실행시키는 셸코드
  • 81. 스택포인터 를 가져오는 함수 셸코드를 올릴 포인터 주소에 동적 메모리 할당 셸코드의 주소 읽어와서 화면에 출력 셸코드 실행 확률을 높이기 위해서 셸코드 앞에 충분한 추가 뒤에 셸코드 추가
  • 82. 배열의 끝을 명확히 알려주기 위해 문자열의 끝 표시 라는 환경변수명으로 셸코드를 환경 변수에 등록 새로운 배시셸 실행 에그쉘 코드를 컴파일해서 실행해 보면 환경변수에 올라간 쉘코드의 주소가 보인다 이제 이 주소를 에 덮어써 보자 공격 에그쉘 코드를 컴파일해서 실행해 보면 환경변수에 올라간 쉘코드의 주소가 보인다 이제 이 주소를 에 덮어써 보자 우리가 공격해야 할 주소는 소멸자가 있는 이고 덮어써야 할 쉘코드 주소는 에그쉘을 띄우면서 확인한 주소다 그러므로 에 있는 값을 으로 바꾸면 된다
  • 83. 지정자 개로 인해 포인터가 배열 바로 앞으로 이동 에서 입력된 지정자 때문에 포인터가 한 번 더 이동해서 배열을 가리 키게 됨 즉 타겟주소 에 해당하는 이 입력된 메모리 주소를 가리키게 됨 지정자에 의해 지금까지 입력된 바이트 바이트 바이트 를 모두 더한 바이트를 진수로 바꾼 이 에 저장됨
  • 84. 버퍼 오버플로우 개념 버퍼오버플로우 개념 정리 버퍼 변수에 데이터를 저장하기 위해 확보된 임시 메모리 공간 지역변수는 순서대로 변수의 크기에 해당하는 간격을 두고 스택에 쌓인다 함수는 스택 프레임이 구성되면서 지역변수 스택프레임 포인터 이전 함수의 베이스 포인터 인자수 인자값 환경변수의 선형 순서로 스택에 배치된다 버퍼 오버플로우 입력값의 크긱까 버퍼의 크기보다 큰지 경계 검사를 하지 않은 경 우 메모리에 확보된 버퍼의 크기를 초과해서 데이터가 저장되면서 버퍼 주변 공간 리턴 주소 등 까지 덮어씌워지는 이상 현상 취약점이 있는 소스코드를 보면 입력받 은 값에 대한 길이가 할당된 버퍼 크기를 넘지 않는지 경계 검사를 하지 않는 것이 취약점의 핵심이다 문제 파악 합계 월 월 월 월 취약점이 있는 바이너리인 와 힌트 파일인 파일이 있고 의 웹페이지가 있는 디렉터리와 공격을 위한 테스트 공간인 디렉토리가 있다
  • 85. 문장을 입력하세요 바이트 크기의 지역변수인 배열이 선언돼 있다 실행 파일 의 권한에 의 권한을 부여한다 문장을 입력하세요 라는 문자열을 출력한다 함수를 이용해 문자열을 입력받는다 입력받은 문자열을 출력하고 종료한다
  • 86. 의도 분석 메모리의 스택 구조를 정확하게 이해하고 버퍼를 오버플로우 시키는 기본 개념을 이해하고 있는지 묻고 있다 공격 문장을 입력하세요 문장을 입력하세요
  • 87. 세그멘테이션 오류 보다시피 바이트까지는 입력해도 정상적으로 처리된다 하지만 위와 같이 스택프레임포 인터나 리턴 주소를 덮어쓰게 되면 세그멘테이션 오류가 나면서 프로그램이 비정상적으로 종료되는 것을 확인할 수 있다 이러한 비정상 종료가 버퍼 오버플로우 취약점의 존재를 뜻하는 것이므로 앞에서 분석했던 방법으로 메모리에 쉘코드를 올려두고 이 쉘코드의 주소로 리턴주소를 덮어쓰는 식으로 공 격해 보자 문장을 입력하세요 핂 컞 汪!!! 己!
  • 88. 스택 가드 개념 버퍼 오버플로우를 이용하면 실행 흐름을 바꿔서 원하는 명령을 실행할 수 있는 중요한 취 약점이 있다는 것을 알았다 그런데 이러한 버퍼 오버플로우의 방어책으로 제시된 방법 중 하나가 바로 스택 가드 다 스택가드는 배열변수와 리턴 주소 사이테 스택 가드라고 하는 공간이 만들어져 있다 스택가드의 개념은 단순하다 레벨 에서와 같은 방법으로 버퍼 오버플로우시켜서 리턴 주 소를 변조하게 되면 당연히 스택 가등 영역도 함께 다른 값으로 변조될 수 밖에 없다 그러 므로 스택 가드에 저장돼 있는 값이 바뀌었다는 것은 버퍼 오버플로우 공격이 일어났다는 것을 의미하고 스택 가드의 변경이 확인되면 프로세스 실행을 차단해서 공격을 방어할 수 있다 문제 파악
  • 89. 소스 코드 흐름 타입의 변수 를 선언하고 값으로 초기화 입력값을 저장할 배열 선언 권한으로 프로세스가 실행되도록 설정 의 값이 인지 확인해서 변조됐으면 프로그램을 종 료 위의 예제 코드에는 스택가드가 변조됐을 때만 결과가 화면으로 출력되고 스택 가드가 변 조되지 않는 정상적인 상황에 처리하는 동작이 전혀 없다 그러므로 인자값을 전달했는데도 아무런 반응이 없는 것에 당황스러워 하지 않기를 바란다 소스코드에 있는대로 정상적으로 동작하는 것이다
  • 90. 의도 분석 현실 세계에서는 해킹 당하지 않는 완전히 안전한 시스템이란 없다 보안 취약점이 발견되 면 패치 버전이 배포되지만 시간이 지나면 또 다른 취약점이 발견되는 사이클을 거친다 이 에 따라 더욱 안전한 시스템을 만들기 위해 끊임없이 패치가 발표되고 해커는 또 다른 취약 점을 찾아내고 있다 이번 레벨에서는 스택 가드를 통해 이 같은 사이클을 보여주는 데 출제 의도가 있다고 볼 수 있다 공격
  • 91. 변조하면 안되는 스태 가드의 값 배시셸을 실행시키는 셸코드 배열의 시작 주소 스택가드 셸코드 리턴 주소의 길이 확인 셸코드 앞부분까지 썰매 할당 뒤에 셸코드 할당 나머지 공간에 썰매 할당 스택 가드의 원본 덮어 쓰기
  • 92. 나머지 공간에 썰매 할당 배시 셸코드의 주소 할당
  • 93. 루틴 분기 키값의 이해 개념 분기 루틴이란 특정 조건을 만족할 때 분기하는 루틴을 말하낟 분기 루틴의 대표적인 예로 소프트웨어를 설치할 때 시리얼키를 입력받아 입력값이 맞으면 프로그램의 모든 기능을 사 용할 수 있고 그렇지 않으면 제한된 기능만 사용할 수 있게 하는 것이 있다 어떻게 보면 이것은 스택 가드와도 비슷한 개념이라고 할 수 있다 즉 메모리에 저장돼 있 는 값을 정확하게 분석할 수 있는지를 묻는 아주 기본적인 문제로 볼 수 있다 문제 파악 레벨 이후로는 의 문제를 그대로 가져왔습니다 버퍼 오버플로우 포맷스트링을 학습하는데는 이 문제들이 최고의 효과를 가져다줍니다 소스코드 흐름
  • 94. 타입의 변수 선언 입력값을 저장할 배열 선언 키보드로 바이트까지 입력받음 리턴 주소까지 덮어쓰려면 바이트를 입력할 수 있어야 함 바이트만 입력받도록 제한해서 버퍼 오버플로우 취약점을 차단한 변수에 값이 있으면 블록을 실행 권한으로 프로세스가 실행되도록 설정 배시쉘 실행 변수를 선언한 부분을 보면 초기값을 설정하지 않았다 그러므로 임의의 쓰레기 값이 할당돼 있을 것이다 그렇다면 우리는 단순하게 변수에 값만 입력하면 되 는 것이다 쉘을 실행하는 코드가 이미 소스코드에 있으므로 오히려 버퍼 오버플로우보다는 쉬울 수 있다 이것은 도움부에서 설명한 바와 같이 쉐어웨어 소프트웨어를 정품으로 크랙 하는 패턴과도 일맥상통한다
  • 95. 의도 분석 이번 레벨은 단순한 버퍼 오버플로우 공격을 차단할 수 있는 할당된 배열 크기의 경계값을 체크하는 방법을 소개하고 있으며 버퍼 오버플로우가 아니더라도 개발자가 설정한 조건값 을 정확하게 분석한다면 프로그램을 다른 방식으로 동작하도록 변경할 수 있음을 보여준다 공격 변수 앞까지는 바이트의 문자로 채우고 변수에는 를 채움으로 써 구문을 참 으로 만들어 권한을 가진 배시쉘이 떨어지게 했다
  • 96. 루틴 분기 키값의 이해 개념 레벨 는 레벨 에서 풀이한 개념에서 포인터를 이용해 한 단계 더 꼬아둔 문제다 언어 를 공부한 모든 독자라면 포인터를 어려워 할 것이다 초보자 입장에서 보면 전혀 필요없는 개념이라고 오해할 수도 있다 개념적으로만 보면 메모리의 값을 바꾸는 것과 메모리에서 가리키는 주소의 값을 바꾸는 것은 큰 차이가 없는 것처럼 이해될 수 있다 문제 파악 소스코드 흐름 타입의 선언 입력값을 저장할 배열 선언 키보드로 바이트까지 입력받음 리턴 주소까지 덮어쓰려면 바이트를 입력할 수 있어야 함 바이트만 입력받도록 제한해서 버퍼 오버플로우 취약점을 차단함 포인터 변수가 를 가리키는지 확인 권한으로 프로세스가 실행되도록 설정
  • 97. 배쉬쉘 실행 포인터 변수를 선언한 부분을 보면 초기값을 설정하지 않았기 떄문에 당연히 임의의 쓰레기 값이 할당되어 메모리의 랜덤한 곳을 임의로 가리키고 있을 것이다 그러므로 레벨 와 같이 단순하게 포인터 변수에 값만을 입력해 주는 것이 아니라 포인터 변수에 있는 값이 가리키는 메모리 주소에 를 넣어야 만 권한의 배쉬셀이 실행될 것이다 이번 레벨에서는 정수 변수가 아닌 포인터 변수가 선언됐음을 다시 기억하길 바란다
  • 98. 의도 분석 개발할 때도 마찬가지지만 시스템 해킹에서는 항상 포인터 변수에 대해 충분히 고려해야 한 다 공격 배열 포인터 변수 앞에 입력할 값 배열 의 시작 주소
  • 99. 포인터 변수 앞에 값 입력 배열 의 시작 주소 입력 공격 명령어 생성
  • 100. 함수 포인터 변조 개념 이번 레벨에서는 앞의 레벨 와 레벨 에서 다룬 단순한 변수형의 포인터보다 더 어려운 함수 포인터와 관련된 문제가 출제된다 여기서는 함수의 시작 번지를 가지고 있는 포인터의 주소값을 다른 함수의 주소값으로 바꾸 면 다른 함수가 실행되는 공격도 가능하다는 것이 핵심이다 마찬가지로 다른 함수의 주소 가 아닌 쉘코드를 올려둔 주소로 번지를 바꾸면 쉘코드가 실행될 것이다 일 문제 파악 에서는 키보드로 바이트만큼 입력받도록 제한해서 버퍼 오버플로우
  • 101. 취약점을 차단하고 있다 하지만 리턴 주소까지 덮어쓰려면 바이트까지 입력할 수 있어야 한다 어셈블리 언어의 문법과 문법 비교 구분 명령어 포맷 명령어 예 명령어 명령어 두 문법은 사실 거의 동일하며 크게 다른 점은 명령어 이후의 출발 과 목적 인자가 뒤바뀐 점 정도다
  • 102. 의도 분석 이번 레벨은 배열과 포인터를 이용해 메모리 주소의 이동을 정확하게 이해할 수 있게 해준 다 힌트에서 제시된 소스코드는 지금까지와는 달리 상당히 복잡한 편이라서 정확한 의도를 팡가하기가 어려울 수 있다 하지만 배열과 포인터로 메모리 주소를 이동할 수 있다는 사실 을 정확하게 알고 있는 독자라면 복잡한 소스코드에서 문제의 핵심을 찾아낼 수 있을 것이 다 의도 분석 이번 장의 서두에서 언급한 것처럼 프로그램 내부에서 호출하는 함수를 다른 함수를 호출하 도록 흐름을 바꾸는 것은 시스템 해커에게 상당히 흥미로우면서도 유용한 공격 방법이다 공격
  • 103. 함수 포인터 변조 개념 레벨 은 레벨 에서 풀이했던 원리와 비슷한 개념이지만 레벨 에 있었던 함수가 없는 소스코드가 제공된다 그러므로 배쉬셀을 스스로 실행할 수 있는 쉘코드를 만들어 레 벨 과 동일하게 함수 포인터가 가리키는 주소를 변조해야 한다 문제 파악 참고로 레벨 에서와 마찬가지로 함수를 실행하는 부분에서는 키보드 로 입력받는 양을 바이트로 제한해서 버퍼 오버플로우 취약점을 차단했다 하지만 리턴 주소까지 덮어쓰려면 바이트까지 입력할 수 있어야 한다는 사실을 기억하자
  • 104. 보다시피 지역 변수의 공간으로 바이트가 확보된 것을 볼 수 있다 하지만 레벨 레벨 에서 분석한 경험을 바탕으로 바이트에 포함되는 지역 변수인 뱨
  • 105. 열의 사이에 끼어있는 더미 공간의 정확한 크기를 추측할 수 있을 것이다 의도 분석 이번 레벨은 버퍼 오버플로우에 대한 다양한 공격 패턴을 점진적으로 코드의 복잡성을 더해 가면서 이해할 수 있게 도와준다 독자들도 직접 실습할 수 있게 디버깅 과정을 간단하게 설 명하고 있으므로 로 메모리 구조를 살펴보는 데 익숙해질 때까지 연습하길 바란다 포인터가 복잡하고 어렵다는 인식을 갖고 있을 것이다 물론 실제로 복잡하기 떄문에 어렵 고 헷갈리는 것도 사실이다 하지만 포인터는 포인터일 뿐이라는 것을 명심하길 바란다 타입의 포인터 타입의 포인터 타입의 포인터 함수 포인터 등 다양한 포인터가 있지만 이 다양한 포인터는 모두 포인터일 뿐이다 즉 포인터가 가리키고 있는 메모리 주소에 저장된 값에 따라 포인터의 타입이 타입이나 타입과 같이 구분되지만 포인터는 함수를 이용해 크기를 확인하면 모두 바이 트 공간을 차지하는 변수일 뿐이다 공격
  • 106. 포인터 활용 개념 언어의 포인터를 이요해 프로그램을 만들어 본 사람이라면 포인터 연산자를 이용해 메모 리를 옮겨 다닐 수 있다는 사실을 알고 있을 것이다 문제 파악
  • 107.
  • 108.
  • 109.
  • 110.
  • 111. 지역변수의 공간으로 바잍트가 확보된 것을 볼 수 있다 변수도 많기 떄문에 메모리 구조를 확인해 볼 필요가 있다 공격 먼저 힌트에 제시된 소스코드의 동작 방식을 보면 이라는 값을 전달해야
  • 112. 배열의 인덱스를 바이트 감소시킬 수 있기 때문에 여기서는 진수인 을 입력 해야 한다 하지만 함수나 함수와 같이 인자값이 아닌 키보드 입력값을 따로 전달받는 경우에 진수값을 전달하려면 파이프를 통해야 한다 즉 다음과 같이 값을 그냥 입력할 경우에는 이라는 진수가 전달되는 것이 아니라 과 같이 개의 문자가 전달된다 따라서 반드시 스크립트를 통해 정확한 진수 값이 전달되게 해야 한다
  • 113. 공유 라이브러리를 이용한 버퍼 오버플로우 개념 버퍼 오버플로우를 차단하는 기법들도 많이 발표됐다 대표적으로 을 비롯해 입력 받는 문자열의 길이를 오버플로우되지 않도록 제한하는 등 다양한 대비책이 있다 하지만 해킹의 힘은 어떤 문제를 방어하기 위해 수립된 대책을 끊임없이 우회하는 방법을 찾는 데 있으므로 해커들은 지속적인 분석과 연구로 차단된 해킹 환경을 우회하는 방법을 계속해서 찾아내고 있다 그중 가장 대표적인 기법이 바로 공유라이브러리를 이용한 버퍼 오버플로우 기법인 공유 라이브러리로의 복귀 다 이 기법 역시 알고 나면 이 해하기가 어렵지 않지만 이 기법을 처음 생각해 낸 사람의 노력은 인정해야 한다 문제 파악 바이트를 입력받아 화면에 출력하는 것이 의도겠지만 입력 문자열의 크기를 검사하지 않 으므로 버퍼 오버플로우 취약점이 있다
  • 114. 지역변수의 공간으로 바이트가 확보된 것을 볼 수 있다
  • 115. 배시셸을 실행시키는 셸코드 스택포인터 를 가져오는 함수 셸코드를 올릴 포인터 주소에 동적 메모리 할당
  • 116. 셸코드의 주소 읽어와서 화면에 출력 셸코드 실행 확률을 높이기 위해서 셸코드 앞에 충분한 추가 뒤에 셸코드 추가 배열의 끝을 명확히 알려주기 위해 문자열의 끝 표시 라는 환경변수명으로 셸코드를 환경 변수에 등록 새로운 배시셸 실행 부분이 추가된 부분이다 이렇게 되면 쉘코드가 실행될 때 의 권한으로 배시쉘이 실행되게 하므로 의 권한으로 배시쉘을 얻을 수 있다
  • 117. 의도 분석 함수가 프로그램을 실행할 떄 어떤 영향을 미치는지 정확하게 이해할 수 있었을 것이다 마치 리눅스 시스템에서 와 설정을 주는 것과 같은 개념이라고 생각해도 될 것이므로 가볍게 이해하길 바란다 그리고 공유 라이브러리로의 복귀 공격과 같은 버퍼 오버플로우 공격의 응용은 약간 복잡할 수는 있지만 좀 더 다양한 공격의 가능성을 제공하 는 기법이므로 알아두는 것이 좋다
  • 118. 포맷스트링 복습 문제 파악 소스코드 흐름 키보드로 입력받은 배열을 선언 권한을 실행 파일에 부여 키보드로 바이트만큼 입력받음 입력값에 대한 경계 검사를 하고 있기 때문에 버퍼 오버플로우로 스택프레임의 리턴 주소를 덮어 쓸 수 없다 입력받은 문자열 출력 자세히 보면 이번 레벨에서는 함수가 있기 떄문에 공격에만 성공하면 쉽게 다음 레벨의 배시쉘을 얻을 수 있을 것이다 키보드로 입력받는 부분 떄문에 이번 레벨에서는 함수의 리턴 주소를 덮어쓸 수 없을 것이다
  • 119. 디버깅이 되지 않는 것을 확인할 수 있다 보다시피 레벨 과 동일하게 네번째에 입력 문자열이 표시되는 것을 볼 수 있다 그럼 이번 에는 덮어써야 할 의 주소를 확인해 보자 출력 결과를 보면 프로그램을 이용해서는 메모리에 올라온 심볼들이 보이지 않는다 심 볼 분석이 되지 않도록 컴파일하면 이와 같이 바이너리에 있는 많은 정보를 숨겨서 쉽게 리 버싱하지 못하게 할 수 있다 하지만 를 이용하면 다음과 같이 메모리에 올라온 심 볼의 위치를 확인할 수 있다
  • 120.
  • 121. 출력 결과에서 번째로 출력된 에서 의 주소가 임을 알 수 있다 하지만 레벨 에서 언급한 바와 같이 다음 바이트만큼 떨어진 주소인 심볼을 덮어써야 하므로 우리가 덮어써야 할 대상 주소는 에 해 당한다 의도 분석 디버깅이 차단된 환경에서 포맷스트링 관련 문제가 제시됐다 공격
  • 122.
  • 123. 참고 자료 문제 풀이로 배우는 시스템 해킹 테크닉 각종 인터넷 해커스쿨 풀이집