목록System (28)
SH1R0_HACKER
localhost login : root password : hackerschoolbof vi /etc/passwd :%s/bash/bash2 :wq
보호되어 있는 글입니다.
[ Type Confusion ] Type Confusion은 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점입니다. 위 코드는 C언어에서 정수를 입력받아 출력하는 예제입니다. puts 함수의 원형은 아래와 같습니다. int puts(const char *s) 정수로 값을 입력받지만 puts 함수는 char* 형 포인터를 인자로 받기 때문에 Type Confusion이 발생해 메모리에 존재하지 않는 주소를 입력한다면 다음과 같이 프로그램이 비정상 종료됩니다. 비주얼 스튜디오에서는 컴파일을 시도하면 오류가 발생합니다. [ Type Casting ] 형 변환은 변수 혹은 객체의 형태를 기존과 다른 형태로 바꾸는 것을 말합니다. 필요에 따라서 변경되는 ..
[ UAF(Use-After-Free) in C++ ] C++ 언어에서도 UAF 취약점이 발생할 수 있습니다. UAF 취약점은 Heap 영역에서 할당된 메모리를 해제(Free)하고 다시사용(re-use)할 때 발생하는 취약점입니다. 4행에서 구조체 S를 정의하고 f() 함수를 호출합니다. main 함수에서 객체 s를 동적 할당하고 11행에서 해제합니다. 13행에서 해제된 s를 참고하여 f 함수를 호출하려고 시도합니다. 이러한 형태는 가장 기본적인 UAF 취약점 입니다. 공격자가 해제된 객체 s의 메모리에 원하는 값을 쓰게 된다면 치명적일 수 있습니다. 아래의 코드는 UAF가 발생하는 또 다른 예제입니다. str_func 함수에서 리턴받은 "aaaa" 문자열을 char형으로 str 변수에 저장하고, dis..
C++에서도 C와 마찬가지로 변수를 사용할 때 초기화하지 않으면 쓰레기값이 출력되기 때문에 취약점으로 이어질 수 있습니다. 비주얼 스튜디오에서 컴파일을 시도하면 오류 메시지가 출력됩니다. C++에서 초기화되지 않은 변수로 인한 문제가 가장 많이 발생하는 부분은 생성자입니다. 위 예제에서 클래스 S는 함수 f에서 인자로 전달된 i와 c를 더한 후 그 값을 리턴합니다. 생성자가 없기 때문에 디폴트 생성자가 생성되고 멤버 변수를 별도로 초기화 하지 않습니다. 따라서 멤버변수 c에는 스택 메모리에 있는 잔여값이 저장되고, s.f(10)이 호출될 때 참조됩니다. 이 결과로 인해 메모리 유출로 이어집니다. 다음 예제입니다. S의 생성자는 mem_size가 인자로 전달되면 그 값만큼 메모리를 할당합니다. 하지만 me..
C++ 언어에서도 버퍼오버플로우가 발생할 수 있습니다. [ String Buffer Overflow ] 위 예제는 20byte의 buf를 할당하고 std::cin 함수를 통해 문자열을 입력받습니다. 하지만 여기서도 입력한 문자열의 길이를 검사하는 부분이 없어서 20byte 이상의 문자열을 입력한다면 버퍼오버플로우가 발생할 수 있습니다. 위 예제에서는 string 타입으로 buf를 할당하는 모습입니다. std::string는 입력받는 길이에 따라 메모리를 자동으로 할당하기 때문에 버퍼오버플로우가 발생하지 않습니다. [ Container Overflow ] C++에서는 데이터 관리를 편하게 하기 위해 벡터, 큐와 같은 여러 종류의 컨테이너들을 지원합니다. main 함수를 살펴보면 다음과 같습니다. std::..
C언어나 C++ 언어를 사용할 때 정수의 형 변환을 제대로 고려하지 못하면 취약점이 발생합니다. 아래는 사이트는 자료형들의 표현 범위입니다. docs.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=msvc-160 데이터 형식 범위 자세한 정보: 데이터 형식 범위 docs.microsoft.com 대입 연산의 경우 좌변과 우변의 자료형이 다를 경우 묵시적으로 형 변환이 일어나게 됩니다. 작은 정수 자료형에 큰 정수를 저장하는 경우, 작은 정수의 크기에 맞춰서 상위 바이트가 소멸됩니다. double 형 변수 num1을 정의하고 12.34를 대입한 후, int 형 변수 num2에 num1을 대입한 후 출력하게 되면 소수점을 무시한 12만 출력되..
변수를 선언하거나 인스턴스를 생성할 때, 프로그래머가 의도한 경우를 제외하고는 반드시 초기화해야 합니다. 메모리를 초기화하지 않는다면 쓰레기 값이 들어가고 이것이 문제를 발생시킬 수 있습니다. 위 예제는 이름의 길이를 입력받고 그 길이가 100 미만이면 메모리를 동적할당합니다. read 함수는 name_len 데이터 길이만큼 p.name에 저장할 수 있습니다. 여기서 초기화되지 않은 값의 사용으로 인해 문제가 발생합니다. 1. read함수는 입력받을 때 널 바이트와 같은 별도의 구분자를 붙이지 않습니다. 따라서 name에 할당된 메모리를 초기화하지 않으면 다른 메모리가 출력될 수 있습니다. 2. name_len 변수의 값이 100 이상이거나 같을 경우에 p.name 값은 쓰레기값이 됩니다. 만약 이 값을..
Double Free 취약점과 UAF (Use After Free) 취약점은 동적 메모리 관리에서 나타납니다. 이미 해제된 메모리를 다시 한 번 해제하거나 (Double Free), 해제된 메모리에 접근해서 값을 쓸 수 있는 문제 (UAF)가 있습니다. 위 예제는 a와 b에 100byte 만큼의 메모리를 할당하고 Hello World! 문자열을 복사한 뒤 출력하는 코드입니다. 하지만 메모리를 해제할 때 이미 해제된 메모리를 다시 한번 해제하는 경우가 발생하면 공격자에 의해 프로그램의 실행 흐름이 변경될 수 있습니다. 아래는 두번째 예제입니다. 메모리의 동적 할당은 Heap 영역에서 발생합니다. 100byte크기의 a가 메모리에 동적할당되고 Hello World! 문자열이 복사된 후 출력됩니다. 그리고 a..
포맷 스트링 버그는 printf나 sprintf와 같이 포맷 스트링을 사용하는 함수에서 발생하는 취약점입니다. // fsb-1.c #include int main(void) { char buf[100] = {0, }; read(0, buf, 100); printf(buf); } 위 예제는 buf에 100byte를 입력받고 printf 함수를 통해 buf를 출력하는 예제입니다. 사용자가 "Hello" 나 "12345" 같은 문자열을 입력다면 printf("Hello"); printf("12345"); 와 같이 정상적으로 문자열이 출력됩니다. 하지만 %x %d 와 같은 포맷 스트링을 문자열로 입력한다면, printf("%x %d")와 같이 인자를 받을 수 있는 함수로 변해버립니다. 하지만 전해줄 인자가 없기..