CS

    [System][Dreamhack] 메모리 보호기법 Mitigation: NX & ASLR

    [System][Dreamhack] 메모리 보호기법 Mitigation: NX & ASLR

    지난 글(Return to shellcode)를 보면 쉘을 딸 수 있었던 이유는 다음과 같다. return addr을 임의의 주소로 덮기 가능 → canary 도입 ⇒ canary leak 으로 우회 버퍼의 주소 알아내기 가능 버퍼안의 쉘코드 실행 가능 공격을 막기 위해 시스템 개발자들은 여려 겹의 보호 기법을 적용해 공격당할 수 있는 표면(Attack Surface) 를 줄여나가려 한다. Attack surface를 줄이기 위한 메모리 보호기법에 대해 드림핵을 기반으로 작성하였다. 요약 return addr을 임의의 주소로 덮기 가능 → canary 도입 ⇒ canary leak 으로 우회 가능 버퍼의 주소 알아내기 가능 → ASLR 도입 버퍼안의 쉘코드 실행 가능 → NX-bit 도입 ASLR ( A..

    [System][Dreamhack] Exploit tech : Return to Shellcode

    [System][Dreamhack] Exploit tech : Return to Shellcode

    드림핵 내용을 기반으로 작성되었다. 문제 파악 // Name: r2s.c // Compile: gcc -o r2s r2s.c -zexecstack #include #include int main() { char buf[0x50]; printf("Address of the buf: %p\n", buf); printf("Distance between buf and $rbp: %ld\n", (char*)__builtin_frame_address(0) - buf); printf("[1] Leak the canary\n"); printf("Input: "); fflush(stdout); read(0, buf, 0x100); printf("Your input is '%s'\n", buf); puts("[2] Ove..

    [System][Dreamhack] wargame - ssp_001 스택 순서

    [System][Dreamhack] wargame - ssp_001 스택 순서

    드림핵 ssp_001문제를 푸는 중 내 생각과는 다르게 스택이 구성되어 있는 것 같아 어셈을 확인해 정리하였다. 코드만 보고 생각한 스택 순서 int main(int argc, char *argv[]) { unsigned char box[0x40] = {}; char name[0x40] = {}; char select[2] = {}; int idx = 0, name_len = 0; ... } 문제의 코드 중 일부 내용이다. 변수가 box, name, select, .. 순서로 선언되어 있어, 스택은 주소값이 높은 곳에서 낮은 곳으로 자라니까 당연히 아래와 같은 순서로 선언되어있을 것이라 생각했다. 이를 이용해 카나리 릭을 해보려 했으나 제대로 되지 않았다. 이 구조가 아닌 것 같아 IDA로 확인해봤다. ..

    [System][Dreamhack] bypass canary

    [System][Dreamhack] bypass canary

    카나리 우회 방법 1. 무차별 대입 (Brute Force) x64 아키텍처에서는 8바이트의 카나리가 생성되고, x86 아키텍처에서는 4바이트의 카나리가 생성된다. 카나리의 첫 바이트는 NULL 바이트이므로, 실제 7바이트(x64), 3바이트(x86)의 랜덤한 값이 포함된다. ⇒ 카나리를 알아내려면 256^7(x64), 256^3(x86) 번의 연산이 필요하다. (1바이트 = 8비트 = 2^8 = 256) ⇒ 연산량이 많아 무차별 대입은 비현실적, 불가능 2. TLS 접근 카나리는 TLS에 전역변수로 저장(fs:0x28)되고, 매 함수마다 이를 참조해 사용한다. TLS 주소는 매 실행마다 바뀌지만, 실행 중 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 또는 쓰기가 가능하다면 TLS에 설정된 카나..

    [System][Dreamhack] 메모리 보호 기법 memory mitigation - Stack Canary

    [System][Dreamhack] 메모리 보호 기법 memory mitigation - Stack Canary

    다음은 드림핵 기반으로 제가 이해한대로 정리한 내용입니다. (잘못된 내용이 있다면 댓글로 알려주세요..!) 스택 카나리(Stack Canary)란? stack buffer overflow로부터 retrun address를 보호하는 기법 = 스택 카나리 (stack canary) 방법 함수의 프롤로그에서 스택 버퍼와 return address 사이에 임의의 값 삽입 함수의 에필로그에서 삽입된 값이 변조되었는지 확인 → 카나리 값 변조가 확인되면 프로세스 강제 종료 stack buffer overflow로 return address를 덮으려면 반드시 스택 카나리를 먼저 덮어야 함 카나리 값을 모르면 return address를 덮을 때 카나리 값이 바뀌게 됨 카나리 값이 바뀌면 프로세스가 강제 종료됨 → 실..

    [System][Dreamhack] stack buffer overflow - 스택 버퍼 오버플로우

    [System][Dreamhack] stack buffer overflow - 스택 버퍼 오버플로우

    드림핵 내용을 기반으로 내 방식으로 이해한 내용을 정리했다. (잘못된 내용이 있다면 댓글로 알려주세요..!) 스택 버퍼 오버플로우 스택의 버퍼에서 발생하는 오버플로우 버퍼 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소 데이터가 저장될 수 있는 모든 단위를 뜻하기도 함 스택 버퍼 스택에 있는 지역변수 힙 버퍼 힙에 할당된 메모리 영역 버퍼가 필요한 이유 데이터의 처리속도 차이 때문 처리 속도가 다른 두 장치 사이의 데이터 전달 시 abcdefg를 전달했지만 받는 쪽에서는 abcd만 받을 수 있음 → 이를 방지하기 위해 수신 측과 송신 측 사이에 버퍼 둠 버퍼 오버플로우 버퍼가 넘치는 것 버퍼는 일정한 크기를 가지고 있다. int로 선언한 지역변수 = 4bytes char[10] = 10bytes 1..

    [Linux] 심볼릭 링크 & 하드 링크 (symbolic & hard)

    [Linux] 심볼릭 링크 & 하드 링크 (symbolic & hard)

    윈도우의 바로가기 같은 개념으로, 리눅스에 링크 개념이 있다. 링크에는 하드 링크(hard link)와 심볼릭 링크(symbolic link)가 있다. 심볼릭 링크 (symbolic link) 데이터가 있는 파일은 하나뿐이고, 그 원본 파일을 가리키는 링크만을 가지는 파일을 만드는 것이다. 원본 파일을 삭제하면 역할을 수행할수는 없지만, 여전히 같은 경로를 가리키면서 남아있다. 따라서 전혀 다른 파일이어도 원본 파일과 이름이 같으면 계속 사용할 수 있다. 이 점이 레이스컨디션 공격으로 이어질 수 있다. 심볼릭 링크 생성 방법 ln -s [원본 파일] [링크 파일 이름] 심볼릭 링크의 내부 작동 방식 - 새로운 inode 생성 원본파일과 링크 파일의 inode가 다른 것을 확인할 수 있다. 즉, 아래의 그..

    [System] 레이스 컨디션(Race Condition)

    [System] 레이스 컨디션(Race Condition)

    더 자세한 내용은 추후에 더 추가할 예정이다. 레이스 컨디션? 한정된 자원을 여러 프로세스들이 사용하기위해 경쟁하는 것을 의미한다. 즉 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근하여 비정상적인 결과가 발생하는 것을 말한다. 레이스 컨디션 공격 레이스컨디션에 의해 비정상적인 상황이 발생한 경우 악용하는 공격으로, 관리자 권한(setuid를 통한 권한상승)으로 실행되는 프로그램 중간에 끼어들어 자신이 원하는 작업을 하는 일종의 가로채기이다. 실행되는 프로세스가 임시파일을 만드는 경우 프로세스의 실행 중 끼어들어 임시파일을 목적파일로 연결(심볼릭 링크)하여 임시파일의 내용을 확인하는 등 악의적인 행워를 할 수 있다. 만약 프로세스가 setuid로 인해 root 권한으로 실행된다면 권한 상승을 통해 ..

    [System] 함수 프롤로그 & 에필로그 (Prologue & Epilogue)

    [System] 함수 프롤로그 & 에필로그 (Prologue & Epilogue)

    우선 함수의 프롤로그와 에필로그에 들어가기 전 스택프레임을 알아야한다. 스택프레임이란? 스택 세그먼트 내부의 단위를 스택 프레임(stack frame)이라고 한다. 이 스택프레임은 함수가 호출될 때 생성되고, 반환될 때 해제된다. 즉 그 함수만의 스택영역을 구분하기 위해 생성되는 공간을 말한다. 스택 프레임 영역을 할당하기 위해 함수 프롤로그(prologue)와 함수 에필로그(epilogue)가 수행된다. 함수 내에서 다른 함수 호출을 위해 필요한 일 돌아갈 위치를 스택에 push한다. 이전 함수의 스택 base addr를 스택에 push한다. 함수를 수행을 마치고 호출 위치로 돌아갈 준비를 위해 스택을 다시 복원한다. 함수를 종료한다. 스택 base pointer를 이전 함수의 스택 base addr로..

    [Linux] 데몬(Daemon)이란?

    [Linux] 데몬(Daemon)이란?

    FTZ level4를 풀다가 /etc/xinetd.d 폴더에 관련된 내용이 나와 검색해보던 중 xinetd데몬의 내용이 나와 데몬과 관련된 내용을 정리하고 넘어가려고 한다. 데몬(Daemon)?? 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스들의 일종으로, 메모리에 상주하다가 요청이 오면 즉시 응답하도록 하는 대기 프로세스이다. 여기서 핵심은 백그라운드 프로세스라는 것이다. 데몬 종류 - standalone & xinetd standalone 독단적으로 움직이는 방식으로, 항상 단독으로 메모리에 상주하고 있다가 요청이 오면 바로바로 처리해준다. 빠르다는 장점이 있지만, 메모리에 계속 상주하고 있어야 되므로 메모리를 많이 잡아먹는다. → 요청이 많은 프로세스는 항상 상주하고 있지 않는다면, ..