분류 전체보기

    SROP

    이론 시그널이 발생하면 커널 모드에서 실행되는데, 유저 모드의 내용을 보존하기 위해 레지스터에 값을 저장해두었다가 다시 가져오게 되며, 이를 이용해 임의의 코드를 실행할 수 있게 된다. 우선 시그널은 커널의 버전에 따라 do_signal arch_do_signal arch_do_signal_or_restart 의 이름의 함수로 시작되는데, syscall number에 따라 해당 시그널을 작동시킨다. 취약점 많은 syscall 중 특히 sigreturn이 취약한데, sigreturn 시스템 콜을 호출하면 restore_sigcontext 함수에 의해 스택의 데이터를 레지스터에 등록하게 되며, static bool restore_sigcontext(struct pt_regs *regs, struct sigc..

    rtld

    1. intro 2. code 및 분석 2.1 code // gcc -o rtld rtld.c -fPIC -pie #include #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } void get_shell() { system("/bin/sh"); } int main() { long addr; long value; initialize(); printf("stdout..

    __environ

    1. intro 2. code 및 분석 2.1 code // Name: environ.c // Compile: gcc -o environ environ.c #include #include #include #include #include void sig_handle() { exit(0); } void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); signal(SIGALRM, sig_handle); alarm(5); } void read_file() { char file_buf[4096]; int fd = open("/home/environ_exercise/flag", O_RDONLY); read(fd, file_buf, sizeof(file_bu..

    Overwrite _rtld_global

    1. intro 2. code 및 분석 2.1 code // Name: ow_rtld.c // Compile: gcc -o ow_rtld ow_rtld.c #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { long addr; long data; int idx; init(); printf("stdout: %p\n", stdout); while (1) { printf("> "); scanf("%d", &idx); switch (idx) { case 1: printf("addr: "); scanf("%ld", &addr); printf("data: "); scanf("%ld", &dat..

    rtld_global

    이론 프로그램이 return 함수와 함께 종료되는 경우 main 함수는 __libc_start_main __GI_exit __run_exit_handlers _dl_fini 등의 함수를 차례로 거치며 종료되는데, 이 중 _dl_fini 코드 내의 _rtld_global 구조체에서 _dl_load_lock을 인자로 __dl_rtld_lock_recursive 함수를 호출하게 된다. # define __rtld_lock_lock_recursive(NAME) \ GL(dl_rtld_lock_recursive) (&(NAME).mutex) void _dl_fini (void) { #ifdef SHARED int do_audit = 0; again: #endif for (Lmid_t ns = GL(dl_nns) ..

    master_canary

    1. intro 2. code 및 분석 2.1 code // gcc -o master master.c -pthread #include #include #include #include #include char *global_buffer; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } void get_shell() { system("/bin/sh"); } void *thread_routine() { char buf[256]; g..

    Master Canary

    1. intro 2. code & 분석 // Name: mc_thread.c // Compile: gcc -o mc_thread mc_thread.c -pthread -no-pie #include #include #include #include void giveshell() { execve("/bin/sh", 0, 0); } void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int read_bytes (char *buf, int len) { int idx = 0; int read_len = 0; for (idx = 0; idx < len; idx++) { int ret; ret = read(0, buf+idx, 1); if (ret <..

    seccomp

    // gcc -o seccomp seccomp.cq #include #include #include #include #include #include #include #include #include #include #include #include int mode = SECCOMP_MODE_STRICT; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int syscall_filter() { #define syscall_nr (o..

    Bypass SECCOMP-1

    코드부터 보자. // Name: bypass_syscall.c // Compile: gcc -o bypass_syscall bypass_syscall.c -lseccomp #include #include #include #include #include #include #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void sandbox() { scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { exit(0); } seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(open), 0); se..

    seccomp 요약

    원리 요약하자면 system call filtering 이다. syscall NR을 기준으로 실행여부를 판단한다. 구조 사용은 아래와 같이 한다. int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); Mode 아래와 같이 2가지 모드가 있다. strict mode : read, write, sigreturn, exit만 허용함. 이외의 system call은 SIGKILL과 함께 즉시 종료. filter mode : 아래와 같은 추가 모드가 있다. SECCOMP_RET_KILL : System call을 수행하지 않고 해당 process를 즉시 종료 시킨다. 해당 proces..