background/linux

    mprotect

    이전에 드림핵의 return to shell이라는 문제를 버퍼에 셸 코드를 저장해두고 리턴 주소를 버퍼의 주소로 overwrite해서 셸을 탈취하는 방식으로 풀었는데 이는 셸 코드가 저장된 영역에 쓰기와 실행 권한이 부여되었기에 가능했던 것이다. 만약 실행 권한이 없었다면 셸 코드가 실행되지 않아 셸 탈취가 불가능하다. mprotect mprotect() 함수는 메모리의 권한을 바꿔주는 함수이다. sys/mman.h 라이브러리에 있는 함수로 아래와 같은 형식을 가지고 있다. int mprotect(void *addr, size_t len, int prot); 인자들을 보면 addr은 권한을 바꿀 주소를 정해준다. len에 바꿀 길이를 정해주고 prot로 바꿀 권한을 정해준다. prot에는 'PROT_권한..

    NOP Sled & RET Sled

    NOP(No OPeration) NOP은 xchg eax, eax와 같이 프로그램의 실행에 영향을 주지 않는 명령어이다. 프로그램이 실행 중에 NOP 명령어를 만나면 다음 명령어로 넘어가는 것과 같은 효과를 준다. (x86 아키텍처의 NOP 명령어 바이트코드는 0x90) NOP Sled, 혹은 NOP Slide는 주로 셸코드의 주소를 정확히 알아내기 힘들 경우 큰 메모리를 확보하여 셸코드 주소의 오차 범위를 크게 만들 때 사용한다. 원래 셸 코드가 저장된 주소로 정확히 이동해야하지만 NOP를 활용하면 중간부터 들어가도 되는 것이다. 셸 코드가 0x100에 저장되어 있다고 가정하면 원래 0x100으로 정확히 실행 흐름을 옮겨야하지만 NOP를 0x10000바이트 추가하면 0x100~0x10100 사이 아무 ..

    PLT(Procedure Linkage Table) & GOT(Global Offset Table)

    라이브러리(Library) PLT, GOT를 이야기하기 앞서 라이브러리에 대해 알아보자. 라이브러리에는 자주 사용하는 혹은 성질이 비슷한 계열의 함수들이 모여있다. 라이브러리를 활용해서 사용자는 함수를 정의할 필요 없이 원하는 함수를 가져다 쓸 수 있다. 라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 나뉜다. 링크(Link) 라이브러리는 링크라는 과정을 통해 소스 코드와 연결된다. 리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF형식을 갖춘 오브젝트 파일(Object file)로 번역된다. 오브젝트 파일은 실행 가능한 형식을 갖추고 있지만 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능하다. 링크 과정을 통해 라이브러리에 정의된 심볼과 관련된 정보들을 찾아..

    [G04T] Buffer OverFlow 1 (BOF1)

    보호되어 있는 글입니다.