포맷 스트링 공격은 데이터의 형태와 길이에 대한 불명확한 정의로 인한 문제점 중 '데이터 형태에 대한 불명확한 정의'로 인한 것으로, 포맷 스트링을 이용하여 버퍼 오버플로우와 같이 메모리에 셸을 띄워 놓고, ret 값을 변조하여 관리자 권한을 획득하는 것이다. 결국 포맷 스트링과 버퍼 오버플로우는 함수 실행시 ret 값을 변조하는 방법만 다를 뿐 기본 개념은 같다고 볼 수 있다. 포맷 스트링 공격은 데이터 형태나 길이가 명확하게 정의되어있지 않아서 생기는 문제점이다. 예를 들어 char *buffer = "wishfree\n%x\n"; print(buffer) 라고 한다면 wishfree가 저장된 이후 메모리에 존재하는 값까지 나타내어지게 된다. 즉, esp가 위치한 메모리 값을 읽어드린다. 이러한 포맷..
버퍼오버플로우 공격을 막기위해 스택에서 쉘코드가 실행되는 것을 방지하는 Non-Executable Stack 기법이 있다. RTL은 이것을 무력화 시키는 공격 방법으로 스택에 있는 ret 주소를 실행 가능한 임의의 주소(libc 영역의 주소)로 돌려 원하는 함수를 실행하게 만드는 기법이다. 메모리에 적재된 공유 라이브러리는 스택에 존재하는 것이 아니므로 Non-Executable Stack 을 우회하는 것이 가능하다. libc 영역에서 셸을 실행할 수 있는 함수인 system, execve, execl 등을 이용할 수 있다. RTL 공격을 사용해 root권한을 탈취해보자. bugfile.c int main(int argc, char *argv[]) { char buffer[10]; strcpy(buffe..
heap영역은 동적할당되는 메모리 공간들을 제어하는 곳이다. BSS(Block Started by Symbol)이라고 불리며 스택과 정반대로 메모리의 하위 주소에서부터 상위 주소로 증가하는 형태다. 이를 활용해 root 권한을 탈취한다. heap-bugfile.c #include #include #include #include #include #define ERROR -1 int fucntion(const char *str){ printf("function 포인터에 호출되는 정상적인 함수\n", str); return 0; } int main(int argc, char **argv){ static char buf[16]; static int(*funcptr)(const char *str); if(argc..
스택 영역의 버퍼 사이즈를 초과시키는 데이터를 삽입해 다른 영역을 오염시키는 BoF(BufferOverFlow)취약점을 이용한다. bugfile로 RET 영역까지 데이터를 덮어씌우고 eggshell 코드가 실행시키도록 하여 root 권한을 탈취하자. 환경 : redhat6.2 eggshell.c EGG, RET을 환경변수로 설정하여 bash 새로 실행시키는 코드이다. 이 코드의 목적은 /bin/sh 을 root권한으로 열어주는 Shellcode를 주입시키는 것인데, 이 코드를 EGG라는 환경 변수에 저장하고, RET에는 스택 주소를 넣어 root권한을 탈취하게 된다. #include #include #include #define DEFAULT_OFFSET 0 #define DEFAULT_ADDR_SIZE..