본문 바로가기

Hacking & Security/System Hacking32

[DreamHack] Stage 6 - (1) Stack Canary # 서론 앞 실습에서는 스택의 반환 주소를 조작하여 실행 흐르을 획득하는 공격기법을 실습하였다. 이번에는 스택 버퍼 오버플로우로부터 반환 주소를 보호하는 스택 카나리(Stack Canart)를 알아보고자 한다. 스택 카나리란? : 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고 함수의 에필로그에서 해당값의 변조를 확인하는 보호기법이다. 카나리 값의 변조가 확인되면 프로세스는 강제로 종료된다. : 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다. # 카나리 작동원리 아래 코드는 스택 버퍼 오버플로우가 발생하는 코드 // Name: canary.c #include int main.. 2022. 3. 5.
[DreamHack] Stage 5 : 혼자 실습 보호되어 있는 글 입니다. 2022. 2. 21.
[DreamHack] Stage 5 - 함께실습 # 서론 반환 주소 덮기 실습 1) 취약점 분석 위 figure1의 취약점은 25번째 줄 scanf("%s", buf)에 있다. %s는 문자열을 입력받을 때 사용하는 것으로, 입력의 길이를 제한하지 않으며, 공백 문자인 띄어쓰기. 탭. 개행문자 등이 들어올 때까지 계속 입력을 받는다. (-> 오버플로우 발생가능) 그래서 정확히 n개의 문자만 입력받는 "%[n]s" 형태로 사용해야 한다. (그런데 입력 끝에 널바이트를 삽입한다. 널 바이트 오버플로우라고 부르며 심각한 보안 위험이 될 수 있다..?) 이 외에도 길이를 입력하지 않는 함수들은 대부분 위험하다고 생각해야 한다. 예시로 strcpy, strcat, sprintf가 있다. => strncpy, strncat, snprintf, fgets, memc.. 2022. 2. 20.
[DreamHack] Stage 5 : Stack Buffer overflow # 서론 스택 버퍼 오버플로우는 역사가 오래된 취약점이다. CVE details에 따르면 스택 버퍼 오버플로우를 포함한 오버플로우 취약점은 이제까지 18081개가 발견되어 전체에서도 3번째로 많이 발견되는 등 유명한 취약점이다. ** 스택 오버플로우 VS 스택 버퍼 오버플로우 ** 스택 영역은 실행중에 크기가 동적으로 확장될 수 있다. 그러나 한정된 크기의 메모리 안에서 스택이 무한히 확장될 수는 없다. 스택 오버플로우는 스택 영역이 너무 많이 확장돼서 발생하는 버그이다. 스택 버퍼 오버플로우는 스택에 위치한 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그다. # 버퍼 오버플로우 스택 버퍼 오버플로우는 스택의 버퍼에서 발생하는 오버플로우. - 버퍼란? 데이터가 목적지로 이동되기 전에 보관되는.. 2022. 2. 19.
[DreamHack] Stage 5 - Background: Calling Convention # 함수 호출 규약 함수의 호출 및 반환에 대한 약속. 1) 함수를 호출할 때는 반환된 이후를 위해 호출자(caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 한다. (함수를 호출하면 프로그램의 실행흐름은 다른 함수로 이동하고 호출한 함수가 반환하면 다시 원래의 함수로 돌아와 기존의 실행 흐름을 이어나가기 때문) 2) 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야 한다. 3) 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약 적용은 일반적으로 컴파일러의 몫, 사용자가 코드를 작성하면 컴파일러가 호출 규약에 맞게 코드를 컴파일한다. (규약을 몰라도 컴파일러가 CPU의 아키텍처에 맞는걸로 컴파일 해줌) 하지만 컴파일러의 도.. 2022. 2. 6.
DreamHack : Stage3 - pwntools 파이썬과 파이프(|)를 이용한 익스플로잇 $ (python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'";cat)| ./rao 익스플로잇이 조금만 복잡해져도 위와 같은 방식은 사용하기 어렵다. 그래서 해커들은 펄, 파이썬, C언어 등으로 익스플로잇 스크립트 또는 바이너리를 제작하여 사용하였다. Figure2는 socket모듈을 사용한 초기 파이썬 익스플로잇 스크립트의 예이다. 파이썬으로 여러개의 익스플로잇 스크립트를 작성하다 보면, 자주 사용하게 되는 함수들이 있다. 1) 패킹 함수(정수를 리틀 엔디언의 바이트 배열로 바꿈) 2) 언패킹 함수(패킹 함수의 역) get_shell( ) 함수의 주소를 리틀 엔디언을 적용하여 변환할 수 .. 2022. 2. 6.