background

    Code Auditing

    소프트웨어 코드 감사(code audit)는 프로그래밍 프로젝트에서 버그, 보안 위반 또는 프로그래밍 규칙을 위배하는 것을 발견하는 것을 목적으로 소스 코드를 종합적으로 분석하는 것이다. 이는 소프트웨어가 배포되기 전에 오류들을 감소시킬 목적의 방어적 프로그래밍 패러다임의 필수 요소이다. C와 C++ 소스 코드는 감사해야 하는 가장 흔한 코드인 반면 많은 고수준 프로그래밍 언어들은 잠재적으로 더 적은 취약한 함수들을 갖는다. (프로그램의 소스 코드 레벨에서 취약점을 분석할 때 코드 오디팅한다고 말한다) reference https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%EA%B0%90%EC%82%AC 코드 감사 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모..

    환경 변수(environ)

    환경 변수(Environment Variable)는 운영 체제에서 사용하는 매번 변할 수 있는 동적인 값들의 모임이다. 시스템의 정보를 갖고 있는 변수를 뜻하며 사용자가 직접 추가 및 수정하거나 삭제할 수 있는 값이다. 리눅스에서 제공하는 명령어들은 "/bin", "/usr/bin" 등의 디렉터리에 위치하는데 우리가 명령어를 입력하면 환경 변수에 명시된 디렉터리에서 명령어를 탐색하고 실행하기 때문에 명령어의 경로를 입력하지 않아도 된다. 환경 변수는 터미널 뿐만 아니라 프로그램에서도 참조한다. 프로그램에서도 명령어를 실행해야 하는 경우에 절대 경로를 입력하지 않아도 명령어를 실행할 수 있다. 이 또한 프로세스를 로드하면서 환경 변수를 초기화하기 때문이다. 환경 변수에 대한 정보는 스택 영역에 존재하며 라..

    ELF 파일 보호 기법

    ASLR Address Space Layout Randomization(ASLR)은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다. (커널에서 지원하는 보호 기법) https://learn.dreamhack.io/85#4 로그인 | Dreamhack dreamhack.io stack canary 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다. 카나리 값의 변조가 확인되면 프로세스는 강제로 종료된다. 공격자는 카나리 값을 정확히 알아야 버퍼 오버플로우 공격이 가능하다. https://learn.dreamhack.io/112#2 로그인 | Dreamhack d..

    SSTI(Server Side Template Injection)

    SSTI(Server Side Template Injection) 공격자가 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입한 다음 서버 측에 실행되면서 생기는 취약점이다. 웹 템플릿 엔진마다 사용되는 페이로드가 다르다. (여기선 Jinja에 대해서만 알아보겠다) 파이썬에는 MRO라는 기능이 구현되어있다. https://ssongkit.tistory.com/138 [Python] MRO(Method Resolution Order) 이 글은 파이썬의 MRO 기능에 대해 공부하기 위해 레퍼런스를 참고해 정리한 글입니다. MRO(Method Resolution Order) 메서드 해결(결정) 순서라고 직역할 수 있겠다. MRO를 이해하기 전 먼저 파이썬은 다 ssongkit.tistory.com MR..

    mprotect

    이전에 드림핵의 return to shell이라는 문제를 버퍼에 셸 코드를 저장해두고 리턴 주소를 버퍼의 주소로 overwrite해서 셸을 탈취하는 방식으로 풀었는데 이는 셸 코드가 저장된 영역에 쓰기와 실행 권한이 부여되었기에 가능했던 것이다. 만약 실행 권한이 없었다면 셸 코드가 실행되지 않아 셸 탈취가 불가능하다. mprotect mprotect() 함수는 메모리의 권한을 바꿔주는 함수이다. sys/mman.h 라이브러리에 있는 함수로 아래와 같은 형식을 가지고 있다. int mprotect(void *addr, size_t len, int prot); 인자들을 보면 addr은 권한을 바꿀 주소를 정해준다. len에 바꿀 길이를 정해주고 prot로 바꿀 권한을 정해준다. prot에는 'PROT_권한..