C에서 이름을 쓰지 않고 함수 호출하기

1 hour ago 3

학교의 C 코드 자동 채점 환경에서 허용 함수 검사를 우회해 execve 심볼을 직접 쓰지 않고 셸을 실행하는 개념 증명에 성공함 ASLR은 메모리 배치 주소를 바꾸지만 같은 세그먼트 안의 함수 간 상대 위치는 유지하므로, 허용된 함수의 주소와 미리 알아낸 오프셋으로 다른 함수의 주소를 계산할 수 있음 채점 환경의 ASan이 printf를 대체해 execve와의 오프셋은 일정하지 않았으며, 대신 ASan이 대체하는 mmap을 호출 대상으로 선택함 mmap으로 쓰기와 실행이 가능한 메모리를 확보하고, 직접 작성한 시스템 호출 루틴으로 x86-64 Linux의 execve를 실행함 목표 VM에서 Hello, World! 출력을 확인한 뒤 학교에 문제를 신고하고 추가 조사는 중단함. 이 우회는 사용자 C 코드를 비교적 자유롭게 실행할 수 있는 환경을 전제로 함 자동 채점기의 허용 함수 제한 학교의 원격 코드 실행 환경은 제출한 프로그램의 실행 결과와 형식을 검사하고, 결과 불일치와 컴파일 오류를 사용자에게 보여줌 사용자에게 드러나지 않는 추가 검사도 있을 것으로 보았으며, 코드 표절 탐지는 학교 연구실의 프랑스어 발표에서 확인할 수 있음 탐색의 출발점은 모든 과제를 해결할 수 있는 단일 해법을 찾는 것이었고, 첫 단계로 임의의 셸 명령 실행 수단을 확보하려 함 채점용 VM에 sh 바이너리가 있다고 가정하고 execve) 호출을 시도함 채점기는 과제별로 허용된 함수만 사용했는지 확인하며, execve는 허용 대상이 아니어서 실행 전에 제출을 거부함 관찰한 동작은 소스 코드를 단순히 grep하는 방식보다 복잡했음 clang으로 전처리와 구문 분석을 수행한 뒤 AST를 검사할 가능성을 추측했지만, 실제 구현을 확인한 것은 아님 고정 주소 대신 함수 간 오프셋 사용 함수 호출이 결국 메모리의 특정 위치로 이동하는 동작이라면, 함수 주소를 직접 구해 호출할 수 있음 하지만 ASLR은 실행 파일, 라이브러리, 힙, 스택의 배치 주소를 무작위화하므로 절대 주소 하드코딩은 사용할 수 없음 -pie로 만드는 위치 독립 실행 파일은 ASLR을 활용할 수 있음 -no-pie로 실행 파일 내부 함수의 주소를 고정할 수 있더라도, 제출자는 대개 빌드 과정을 통제할 수 없음 execve는 실행 파일에 직접 포함된 함수가 아니라 동적으로 로드되므로 이 방법으로도 주소가 고정되지 않음 ASLR은 세그먼트 배치를 바꾸지만 내부 내용과 함수 순서는...

Read Entire Article