포너블

포너블/Stack

FSOP

file stream oriented programming _IO_FILE 이란? 리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체, fopen(), fwrite(), fclose() 등 파일 스트림을 사용하는 함수가 호출되었을때 할당 구조체 struct _IO_FILE { int _flags;/* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr;/* Current read pointer */ char *_IO_read_end;/* End of get area. */ char *_IO_r..

포너블/Stack

rtld global

이는 exit함수로 종료될 경우에 Full RELRO 보호기법이 적용되어있을 때 사용 가능한 공격이다. Full RELRO 보호기법이 적용되어 있기 때문에 .fini_array overwrite는 사용할 수 없다. 우선 main이 종료되는 과정을 보자. main이 종료되는 과정 main 함수가 리턴된 후, exit 함수를 호출한다. 여기서 인자값이 0인것을 알 수 있는데 이는 흔히 c언어에서 main의 마지막에 return 0 ; 를 하는데 이 0이 exit함수의 파라미터로 들어가 것이다. exit함수 내부에서는 __run_exit_handlers를 호출한다. 계속 따라가다 보면 _dl_fini를 호출한다. __run_exit_handlers 함수는 exit_function 구조체 멤버 변수인 flavo..

포너블/Stack

__environ을 이용한 스택 주소 leak

stack address leak libc_base를 알고있을 때 stack_address 를 알아낼 수 있는 기법이다. 라이브러리에서는 프로그램의 환경 변수를 참조해야 할 일이 있다. 이를 위해 libc.so.6에는 environ 포인터가 존재하고, 이는 프로그램의 환경 변수를 가리키고 있다. environ 포인터는 로더의 초기화 함수에 의해 초기화된다. environ 변수의 오프셋 구하는 법 objdump -D /lib/x86_64-linux-gnu/libc.so.6 | grep "environ" environ에 stack 주소가 있는 것을 알 수 있다. 예제 //gcc -zexecstack -no-pie -o enp enp.c #include #include #include long int buf_..

포너블/Stack

stack pivot

stack pivoting이란? ROP를 하고 싶은데 BOF가 ret까지만 덮을수 있을경우(overflow가 많이 나지 않은 경우)혹은 main으로 돌아갈 수 없는 경우에 하는 방법이다 공격방법 gadget을 이용해서 쓰기 가능한 공간에 Fake Stack을 구성해놓고 chaining하는 기법이다. 특정 영역에 값이 있거나 값을 쓸수 있을경우 SFP를 이용하여 스택을 옮기고 해당 부분의 코드를 실행한다. 즉 어떤 공간을 스택처럼 사용하는 것이다. 예를 들면 sfp에 bss주소를 넣고 read등의 함수를 사용한다. 그리고 leave_ret 가젯을 통해 rbp를 bss로 보내 bss를 스택처럼 사용한다. 그리고 ret으로 그 이후의 명령어들을 실행시킨다 예제 //gcc -o pivot pivot.c -fno..

포너블/Stack

type confusion

Type Confusion이란? type confusion은 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화 되었을 때와 다른 타입으로 사용할 때 발생하는 취약점이다. 해당 취약점이 존재한다면 memory corruption이 유발되어 공격자가 프로그램을 공격하는 것이 가능해질 수 있다. 예제 #include int main(){ int a; scanf("%d", &a); puts(a); } 해당 코드는 정수를 입력받아 해당 값을 출력해주는 코드이다. 하지만 puts함수는 char * 형 포인터를 인자로 받는다. 그래서 type confusion이 발생하여 존재하지 않는 메모리를 참조해서 비정상 종료된다.

포너블/Stack

race condition

race condition이란? 둘 이상의 프로세스가 하나의 리소스에 사전 협의 없이 동시에 접근 가능할 때, 상호 간에 리소스의 현재 정보에 대해 동기화가 되지 않아 발생하는 취약점이다. 이 취약점은 임시파일이 사용되는 환경에서 발생하는데 만약 실행 중에만 중요한 파일을 임시로 생성후 사용이 끝난 후 삭제하는 프로그램에서 발생한다. 예제 #include #include #include #include #include void setup_environment() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); } int main(int argc, char *argv[])..

포너블/Stack

out of bound

Out Of Boundary란? 배열의 범위를 벗어난 메모리에 접근할 수 있는 취약점으로 개발자가 인덱스에 대한 검사를 제대로 하지 않으면 발생한다. 임의의 주소 읽기, 쓰기로 이어질 수 있다. 예시 #inlcude int main(){ int a[10]; printf("%p\\n", a); printf("%p\\n", &a[0]); printf("----\\n"); printf("%p\\n", a[-1]); printf("%p\\n", a[100]); return 0; } a의 배열이 0부터 9까지 있지만 범위를 넘어서서 오프셋에 따른 메모리를 참조한다. 예제_Dreamhack_out of bound 보호기법 체크 32bit인것을 알 수 있다. c코드 char name[16]; char *command..

포너블/Stack

format string bug

FSB란? printf와 같은 함수의 인자 개수는 포맷 문자 개수로 결정된다. 이때 사용자의 포맷 스트링 입력이 그대로 buf에 값이 넣어지면 우리가 원하는 값을 출력이 가능하다. 예제 #include void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); } int main() { initialize(); char* buf[0x40] = {0,}; printf("입력 : "); read(0, buf, 0x50); printf(buf); return 0; } 해당 코드에 aaaaaaaa를 입력하면 aaaaaaaa를 출력한다. 그런데 buf를 포멧스트링이 아니라 buf 변수 자체로 출력을 하기 때문에 FSB..

K0n9
'포너블' 카테고리의 글 목록 (3 Page)