background

    SigReturn-Oriented Programming(SROP)

    SigReturn-Oriented Programming(SROP)

    signal 대회 문제를 풀이해보면 프로그램의 정상 종료를 위해 alarm 함수를 호출하고 지정한 시간이 지나면 프로그램을 종료하기 위한 시그널 핸들러를 호출하는 코드를 자주 볼 수 있다. 아래는 예제 코드이다. // Name: sig_alarm.c // Compile: gcc -o sig_alarm sig_alarm.c #include #include #include #include void sig_handler(int signum){ printf("sig_handler called.\n"); exit(0); } int main(){ signal(SIGALRM,sig_handler); alarm(5); getchar(); return 0; } 코드를 살펴보면, signal 함수를 사용해 SIGALRM ..

    Master Canary

    (드림핵 강의를 이해하기 위해 요약해본 글) Thread Local Storage (TLS) TLS는 쓰레드의 저장 공간이다. ELF 바이너리를 살펴보면 각각의 목적을 가진 섹션에서 데이터를 관리한다. (코드를 실행하기 위한 .text, 초기화되지 않은 전역 변수를 위한 .data 등) 이와 달리 TLS 영역은 쓰레드의 전역 변수를 저장하기 위한 공간으로 로더(Loader)가 할당한다. 로더에서 TLS 영역을 할당하고 초기화하는 함수인 init_tls 함수가 있는데 해당 함수 내부 _dl_allocate_tls_storage 함수에서 TLS 영역을 할당하고 이를 tcbp에 저장한 뒤 TLS_INIT_TP 매크로의 인자로 전달한다. static void * init_tls (void) { /* Constr..

    SECCOMP

    드림핵 강의를 보고 이해한대로 요약한 글이다 (자세한 내용은 강의 참조) SECure COMPuting mode (SECCOMP) 리눅스 커널에서 프로그램의 샌드박싱 매커니즘을 제공하는 컴퓨터 보안 기능이다. SECCOMP를 사용하면 애플리케이션에서 불필요한 시스템 콜의 호출을 방지할 수 있다. (execve와 같은 시스템 콜이 굳이 실행될 필요가 없다) 해당 시스템 콜은 공격 시에 일반적으로 임의의 명령어를 실행하기 위해 사용된다. 만약 execve 시스템 콜의 실행을 방지하는 정책을 적용하면 외부의 공격으로부터 execve 시스템 콜이 실행될 경우 애플리케이션을 즉시 종료한다. 따라서 애플리케이션의 취약점이 존재해도 외부의 공격으로부터 피해를 최소화할 수 있다. SECCOMP는 두 가지의 모드를 선택..

    Command Injection for PHP

    PHP에 시스템 명령어를 실행하기 위한 system 함수가 있다. PHP에선 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 escapeshellcmd 함수를 사용한다. 이는 메타 문자가 입력됐을 때 해당 문자 앞에 '\'를 삽입해 타 명령어를 실행할 수 없도록 한다. escapeshellcmd 함수에서 메타 문자를 활용한 커맨드 인젝션은 불가능하다. 그러나 특정 명령어의 인자로 입력값이 전달되는 경우 공격자는 실행하려는 명령어의 옵션을 조작할 수 있다. 명령어의 인자를 조작할 수 없도록 하려면 escapeshellarg 함수를 사용해야 한다. (escapeshellcmd 함수를 사용할 경우 메타 문자를 활용하지는 못하지만 명령어의 옵션 또는 인자를 조작할 수 있다) zip zip 명령어는 압축 파일을 ..

    Command Injection for Linux (2)

    Command Injection for Linux (2)

    드림핵 강의에서 입력 값의 길이가 제한된 환경에서 활용할 수 있는 방법을 알려준다. 아래 코드는 입력 길이가 제한된 상황에서 공격자의 서버와 연결을 맺는 방법이다. “/tmp” 디렉터리는 누구나 읽고 쓸 수 있는 권한이 존재하기 때문에 해당 위치에 “bash