핵심 요약
- 학교의 자동 과제 채점 시스템이 허용된 함수 외에 `execve` 같은 시스템 함수 사용을 AST 수준에서 차단하자, 학생이 함수 이름을 코드에 쓰지 않고 호출하는 방법을 연구했습니다.
- ASLR 환경에서도 세그먼트 내 함수 간 오프셋이 일정하다는 점을 노렸으나, 채점기의 ASan 옵션 때문에 표준 함수들이 서로 다른 영역으로 분리되는 복잡한 변수에 직면했습니다.
- 결국 `mmap` 등 동일 세그먼트에 남은 함수를 찾아내 메모리 오프셋을 유출하고 권한을 우회하려는 집념 어린 해킹 과정을 공개했습니다.
요약 한 해외 컴퓨터 공학 학생이 학교의 자동 채점 시스템을 뚫기 위해 시도한 기상천외한 C 언어 해킹 과정을 공유해 화제를 모았습니다. 글쓴이에 따르면 학교 시스템은 제출된 코드가 정상 실행되는지, 서식이 올바른지 등을 점검할 뿐 아니라, 각 과제에서 허용된 함수만 사용했는지 검사하는 통제된 원격 코드 실행 환경을 갖추고 있었습니다.
글쓴이와 친구는 모든 과제를 하나의 코드로 해결하기 위해 임의의 셸 코드를 실행하는 `execve` 함수 호출을 목표로 잡았습니다. 하지만 채점 시스템은 단순 텍스트 검색을 넘어 Clang 등을 이용해 AST(추상 구문 트리) 수준에서 허용되지 않은 함수 이름을 걸러내고 있었기에 `execve`라는 이름을 코드에 직접 적는 순간 컴파일 단계에서 탈락했습니다.
이에 두 사람은 함수 이름을 직접 쓰지 않고 메모리 주소를 찾아내 호출하는 방법을 모색했습니다. 현대 운영체제는 보안을 위해 ASLR(주소 공간 배치 난수화)을 적용해 매 실행마다 메모리 주소가 바뀌지만, 동일 세그먼트 내 함수 간의 상대적 거리(오프셋)는 일정하다는 점에 착안했습니다. 즉, 항상 사용 가능한 `printf`와 목표 함수의 오프셋을 알면 주소를 계산해 뛸 수 있다는 계산이었습니다.
하지만 로컬 테스트에서 `printf`와 `execve` 사이의 주소 차이가 계속 바뀌는 난관에 봉착했습니다. 바이너리를 분석한 결과 채점 환경이 메모리 오류 탐지 도구인 ASan(-fsanitize=address)을 켜고 빌드되어, `printf` 같은 표준 라이브러리 함수들이 ASan 인터셉터로 대체되어 glibc의 `execve`와 서로 다른 세그먼트에 위치해 있었기 때문입니다. 결국 글쓴이는 보안 정책(W^X)을 우회해 실행 가능한 메모리를 할당해 주는 `mmap` 함수 등 같은 세그먼트에 있는 다른 함수를 활용해 오프셋을 유출하고 호출을 시도하는 복잡한 기술적 과정을 풀어냈습니다.
Sponsored · 광고