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
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)/
위 링크를 참고하시면 도움이 되지않을까 싶네요.