seccomp 코드 질문
    struct sock_filter filter[] = {
        /* Validate architecture. */
        BPF_STMT(BPF_LD+BPF_W+BPF_ABS, arch_nr),
        BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ARCH_NR, 1, 0),
        BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
        /* Get system call number. */
        BPF_STMT(BPF_LD+BPF_W+BPF_ABS, syscall_nr),
        };
    
    struct sock_fprog prog = {
    .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
    .filter = filter,
        };
    if ( prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1 ) {
        perror("prctl(PR_SET_NO_NEW_PRIVS)\n");
        return -1;
        }
    
    if ( prctl(PR_SET_SECCOMP, mode, &prog) == -1 ) {
        perror("Seccomp filter error\n");
        return -1;
        }

드림핵 seccomp문제 코드중

    .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
    .filter = filter,

.len의 .이 대체 뭔뜻인지 모르겠습니다 아예 저 코드 자체가 어떤것인지 설명해주실수 있나요??

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ARCH_NR, 1, 0),
.
.

   .filter = filter,
.
.
.

또한 마지막에 세미콜론인 ; 가 아닌 쉼표 , 가 와두 되는건가요??.. 무슨 뜻인거죠??..

# #seccomp #필터 #구조체 #세미콜론
작성자 정보
답변 1
avatar
keyme
CTF Second Place

.은 구조체 필드 초기화를 하는 과정에서 구조체에 정의된 변수를 지정하는 것이라고 생각하시면 될 것 같습니다.

struct sock_fprog {
    unsigned short     len;     /* BPF 인스트럭션 개수 */
    struct sock_filter *filter; /* BPF 인스트럭션들의
                                   배열의 포인터 */
};

sock_fprog 구조체 len 변수를 초기화하는 과정이다보니, .len으로 표기한 것입니다.

다음으로 ;가 아닌 ,가 사용된 것은 어떻게 설명해야지 쉽게 이해될지는 모르겠지만 나름대로 설명해보자면, 보통 ;는 C언어에서 코드 1줄의 마지막에 사용되면서 끝맺음을 의미합니다.

struct sock_filter filter[] = {
        /* Validate architecture. */
        BPF_STMT(BPF_LD+BPF_W+BPF_ABS, arch_nr),
        BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ARCH_NR, 1, 0),
        BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
        /* Get system call number. */
        BPF_STMT(BPF_LD+BPF_W+BPF_ABS, syscall_nr),
        };

지금 예제 같은 경우에는 struct sock_filter filter를 초기화하는 부분이 1줄이고 마지막에 ;가 사용된 것을 알 수 있습니다. ,로 구분 된 것은 filter 배열에 저장할 BPF들을 구분한 것입니다.

https://wariua.github.io/man-pages-ko/seccomp(2)/

위 링크를 참고하시면 도움이 되지않을까 싶네요.

2023.09.28. 22:14
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기