목록전체 글 (126)
SH1R0_HACKER
C++ 언어에서도 버퍼오버플로우가 발생할 수 있습니다. [ String Buffer Overflow ] 위 예제는 20byte의 buf를 할당하고 std::cin 함수를 통해 문자열을 입력받습니다. 하지만 여기서도 입력한 문자열의 길이를 검사하는 부분이 없어서 20byte 이상의 문자열을 입력한다면 버퍼오버플로우가 발생할 수 있습니다. 위 예제에서는 string 타입으로 buf를 할당하는 모습입니다. std::string는 입력받는 길이에 따라 메모리를 자동으로 할당하기 때문에 버퍼오버플로우가 발생하지 않습니다. [ Container Overflow ] C++에서는 데이터 관리를 편하게 하기 위해 벡터, 큐와 같은 여러 종류의 컨테이너들을 지원합니다. main 함수를 살펴보면 다음과 같습니다. std::..
[ 문제 ] [ 풀이 ] 문제에 첨부된 파일을 와이어샤크로 열어보니 TCP로 통신을 주고받은 것 같습니다. Follow TCP Stream 기능을 활용해 데이터를 보면 irc.capturetheflag.withgoogle.com 의 사이트가 많이 보입니다. 이 부분을 보니 IRC (Internet Relay Chat) 서버에 연결하여 통신을 하였다는것을 확인할 수 있습니다. 아래쪽으로 계속해서 보면 다음과 같이 채팅의 흔적들을 확인할 수 있습니다. 채팅같이 생긴 문장의 앞에는 공통적으로 PRIVMSG 문구가 붙어있습니다. Preview Message 의 약자로 예상을 하고 채팅들을 재현해 보았습니다. 나 : hey 상대 : How's it going? 나 : it's going 상대 : i can haz..
[ 문제 ] [ 풀이 ] 위 이미지는 문제에 첨부된 hidden.jpg 파일입니다. 그림에 자세히 보면 희미하게 글씨가 보이지만 명도가 너무 높아 제대로 보기가 힘듭니다. 포토샵으로 노출이나 선명도를 조절해서 Flag를 찾거나, Forensically (https://29a.ch/) 사이트를 통해 찾을 수 있습니다. ▲ 포토샵으로 찾아 본 플래그 ▲ Forensically 사이트를 통해 찾아 본 플래그 KEY : tjctf{th3_f0x_jump3d_0v3r_m3}
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")와 같이 인자를 받을 수 있는 함수로 변해버립니다. 하지만 전해줄 인자가 없기..
Off-by-one 취약점은 경계 검사에서 하나의 오차가 있을 때 발생하는 취약점입니다. // off-by-one-1.c #include void copy_buf(char *buf, int sz) { char temp[16]; for(i = 0; i
OOB (Out Of Boundary)는 버퍼의 길이 범위를 벗어나는 인덱스에 접근할 때 발생하는 취약점 입니다. 다음은 첫 번째 예제입니다. // oob-1.c #include int main(void) { int win; int idx; int buf[10]; printf("Which index? "); scanf("%d", &idx); printf("Value: "); scanf("%d", &buf[idx]); printf("idx: %d, value: %d\n", idx, buf[idx]); if(win == 31337){ printf("Theori{-----------redacted---------}"); } } scanf 함수로 idx 값을 저장하고 buf[idx]에 입력한 값을 저장합니다. ..
보호되어 있는 글입니다.