지옥방 3주차 과제 DreamHack-System Exploitation Fundamental
이 친구와 이번주 과제를 시작해보자!
원래 공부 잘하는 사람은 OT나 수업설명 같은거(다른 사람들은 보통 안듣는 시간)를 잘 보고 듣는다고 하길래 따라해봤다.
취약점의 발생 원인을 이해하고, 공격 기술과 보호 기법의 진화 흐름을 알게 되는 것이 바로 이 강의가 추구하는 방향!
그 방향으로 알맞게 갔으면 좋겠다,,
해킹
특정 문제를 풀거나 비효율적인 시스템을 개선하는 해결책이라는 의미를 담은 단어 핵(hack)에서 유래.
컴퓨터의 하드웨어나 소프트웨어, 네트워크, 웹사이트 등 각종 정보 체계에서 주어진 권한 이상을 얻거나 의도하지 않은 동작을 일으키는 행위이다!
웹 사이트를 공격하는 웹해킹, 컴퓨터와 컴퓨터가 연결되는 네트워크를 공격하는 네트워크 해킹, 그리고 이 강의에서 자세하게 다루게 될!! 프로그램의 약점을 공격하는 시스템 해킹, 특히 소프트웨어 해킹
소프트웨어 버그 프로그램이 잘못된 결과를 내거나, 오류를 발생하는 등의 의도치 않은 동작을 수행하게 되는 문제.
소프트웨어 취약점 공격자가 주어진 권한 이상의 권한을 획득하거나 프로그래머가 의도하지 않은 동작을 수행할 수 있도록 하는 소프트웨어 버그
익스플로잇 악용이라는 뜻을 가지고 있는 단어로, 취약점을 이용해 공격자가 의도한 동작을 수행하게 하는 코드 혹은 이를 이용한 공격 행위
프로그래머가 의도하지 않은 동작을 수행하는 소프트웨어 버그(Buggy)가 가장 상위에
그러한 소프트웨어 버그 중 보안에 영향을 미칠 수 있는 버그를 소프트웨어 취약점(Vulnerability)
소프트웨어 취약점 중 이를 이용해 공격자가 의도한 동작을 수행할 수 있는 버그를 익스플로잇 가능한 취약점(Exploitable Vulnerability)
이런 익스플로잇 가능한 취약점이라고 해도 항상 안정적으로 성공할 수 있는것이 아닌데! 이 중에서도 매우 높은 확률로 공격에 성공할 수 있는 버그를 안정적으로 익스플로잇 가능한 취약점(Reliably Exploitable Vulnerability)
취약점의 종류
메모리 커럽션 취약점 C/C++과 같은 저수준 언어에서 메모리를 조작해 공격하는 방법
- Buffer Overflow : 가장 대표적인 취약점.프로그래머가 할당한 크기의 버퍼보다 더 큰 데이터를 입력받아 다른 메모리 영역을 오염!
- Out-Of-Boundary : 버퍼의 길이 범위를 벗어나는 곳의 데이터에 접근할 수 있는 취약점
- Off-by-one : 경계 검사에서 하나 더 많은 값을 쓸 수 있을때 발생하는 취약점. 가량 32바이트 크기의 버퍼에 인덱스 32로 접근
- Format String Bug : printf나 sprintf와 같은 함수에서 포맷 스트링 문자열을 올바르게 사용하지 못해 발생하는 취약점
- Double Free/Use-After-Free : 동적 할당된 메모리를 정확히 관리하지 못했을때 발생. 이미 해제된 메모리를 다시 한 번 해제하려고 시도하는 것이 Double Free, 해제된 메모리에 접근해 이를 사용하려고 하는 것은 User-After-Free
- etc
로지컬 취약점 메모리를 조작할 필요 없이 공격할 수 있는 방법
- Command Injection : 사용자의 입력을 셸에 전달해 실행할 때 정확한 검사를 진행하지 않아 발생하는 취약점.
- Race Condition : 여러 스레드나 프로세스의 자원 관리를 정확히 수행하지 못해 데이터가 오염되는 취약점.
- Path Traversal : 프로그래머가 가정한 디렉토리를 벗어나 외부에 존재하는 파일에 접근할 수 있는 취약점
- etc
미티게이션 취약점의 존재 여부와는 무관하게 프로그램을 보호하는, 취약점의 공격을 어렵게 만드는 일을 하는 든든한 녀석!
버퍼란? 지정된 크기의 메모리 공간이라는 뜻(C언어 한정)
버퍼 오버플로우 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점.
발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우와 같이 나눠서 부른다.
스택 버퍼 오버플로우 가장 초기에 연구되었던 형태의 버퍼 오버플로우, 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생
버퍼 A와 버퍼 B는 각자 8 바이트씩 메모리에 할당되어있다. 그것도 연속으로(선형적으로)
버퍼 A에 16바이트 크기의 데이터를 복사한다면 버퍼 A를 채우고 남은 8바이트의 데이터는 그 뒤의 영역인 버퍼 B에 쓰여지게 된다.
이를 우리는 버퍼 오버플로우가 발생했다고 하고! Undefined Behavior(정의되어 있지 않은 동작)을 이끌어낸당.
16바이트 크기의 버퍼 buf를 스택에 할당하고, 사용자로부터 gets()를 이용하여 입력받는다. 이때 gets함수는 사용자가 개행을 입력하기 전까지 입력했던 모든 내용을 첫 번째 인자로 전달된 버퍼에 저장하는 함수이므로!!! 사용자가 16바이트가 넘는 데이터를 입력해버리면, 스택 버퍼 오버플로우가 발생한다.
main 함수에서 check_auth함수를 호출할때 인자로 argv[1]을 전달하고 리턴값에 따라 Admin으로 로그인하느냐, 로그인이 막히느냐가 결정된다. check 함수에서는 인자로 주어진 password, 즉 argv[1]을 temp 라는 16 바이트 크기의 버퍼에 복사를 진행하는데, argv[1]의 길이만큼 복사를 한다. 이때 만약 argv[1]에 16 바이트가 넘는 문자열을 전달한다면 스택 오버플로우가 발생할 것이다!
스택 메모리 상태를 살펴보면 temp 버퍼 뒤에 바로 이어서 auth 값이 존재할 것이므로, temp에 복사를 진행할때 스택 오버플로우가 발생한다면? auth에 데이터가 침범을 하고, 이 값이 0이 아닌 데이터라면 실제 인증 여부와는 상관없이 line 24의 if 문은 항상 참!
위와 같이 16바이트 크기의 문자열로 temp 버퍼에 할당된 메모리 영역을 채워주고
스택 오버플로우를 이용해 auth의 영역에 0이 아닌 값을 입력해준다면 line24의 if 문은 항상 참을 반환하게 되면서 "Hello Admin!"이 출력되는 것을 볼 수 있다.
scanf 를 이용해 size 변수에 값을 입력받고, read 함수를 사용해 size 만큼 buf에 데이터를 입력받는다.
메모리 상에는 buf, size, win 순서로 할당되어 있으니, buf 버프를 채우는데 24바이트, size를 채우는데 4 바이트, win을 채우는데 4 바이트가 필요하기에 32바이트를 입력하겠다고 하고, 29번째부터 32번째까지 "ABCD"를 넣어주면 win 버퍼에 "ABCD"가 저장되며 line 13의 if문에서 참을 반환하게 된당.
32 바이트 크기의 buf를 초기화 하고, 31 바이트 크기의 데이터를 read 함수를 이용해 입력받는다.
sprintf 함수를 통해 버퍼에 값을 쓸때는 두번째 인자로 주어진 "Your Input is: "가 앞에 붙는다는 사실을 주의!!
31바이트를 꽉 채운다면 "Your Input is: " 문자열이 앞에 붙어 총 길이가 32바이트를 넘게 된다
buf 의 메모리 앞에 이미 추가된 Your Input is 문자열을 고려해 데이터를 넣어보면 스택 버퍼 오버플로우가 발생했음을 알 수 있당.
힙 오버 플로우
malloc 힙 영역에 메모리를 동적 할당하는 함수
memset 배열 초기화할 때 많이 사용하는 함수
40 바이트 크기의 힙 버퍼 input과 hello를 할당하고, memset을 이용해 둘다 초기화시켜준다.
hello 버퍼에는 "HI!" 문자열을 복사하고, read 함수를 이용하여 input 버퍼에 100바이트 크기의 데이터를 입력받는다. 여기서 input 버퍼는 할당할 당시 40바이트 크기의 버퍼로 설정을 했기에 여기서 100 바이트 크기의 데이터를 입력받으면 힙 오버플로우가 발생합니당.
댓글
이 글 공유하기
다른 글
-
지옥방 3주차 과제 라젠카 뿌시기(Return to Shellcode)
지옥방 3주차 과제 라젠카 뿌시기(Return to Shellcode)
2020.04.24 -
지옥방 3주차 과제 달고나 문서 뿌시기!
지옥방 3주차 과제 달고나 문서 뿌시기!
2020.04.23 -
지옥방 스터디 포너블
지옥방 스터디 포너블
2020.04.09 -
지옥방 웹해킹 1주차 과제
지옥방 웹해킹 1주차 과제
2020.03.30