처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.06.22 25

리눅스 시스템 콜을 가로채는 새로운 시도, 그리고 인텔에서 막힌 이유

Hacker News 원문 보기

프로그램이 OS에 말을 거는 통로, 시스템 콜

우리가 만든 프로그램은 혼자서는 파일 하나 못 열어요. 파일을 읽거나, 네트워크로 데이터를 보내거나, 메모리를 더 달라고 하는 일은 전부 운영체제(커널)한테 부탁해야 하거든요. 이때 쓰는 게 바로 시스템 콜(system call)이에요. 프로그램과 커널 사이의 공식 창구라고 보면 됩니다. x86-64 리눅스에서는 syscall이라는 딱 한 줄짜리 기계어 명령으로 이 창구를 두드려요.

그런데 이 창구를 누군가 옆에서 엿보고 싶을 때가 있어요. strace 같은 디버깅 도구, 프로그램을 격리하는 샌드박스, 보안 모니터링 시스템... 전부 "이 프로그램이 지금 무슨 시스템 콜을 호출하는지" 가로채서 보고 싶어 하거든요. 이걸 시스템 콜 계측(instrumentation)이라고 부릅니다.

가로채기가 생각보다 어려운 이유

문제는 이게 공짜가 아니라는 거예요. 전통적인 방법인 ptrace(strace가 쓰는 방식)는 시스템 콜 하나 가로챌 때마다 커널과 프로그램 사이를 왔다 갔다 하는 문맥 전환(context switch)이 일어나서 엄청 느려요. seccomp-bpf는 빠르지만 할 수 있는 일이 제한적이고요.

그래서 나온 게 바이너리 재작성(binary rewriting)이에요. 프로그램의 기계어 코드에서 syscall 명령을 직접 찾아내서, 우리가 만든 함수로 점프하게 바꿔치기하는 거죠. 그런데 여기서 골치 아픈 함정이 하나 있어요. syscall 명령은 딱 2바이트(0F 05)거든요. 보통 다른 곳으로 점프시키려면 주소까지 적어야 해서 5바이트는 필요한데, 2바이트짜리를 5바이트로 늘려 쓰면 바로 옆에 있던 다음 명령어를 덮어써 버려요. 코드가 박살나는 거죠.

2바이트 안에서 승부 보기

이 문제를 우아하게 푼 유명한 기법이 zpoline이에요. syscall(0F 05)을 call *%rax(FF D0)로 바꾸는데, 이것도 똑같이 2바이트라 옆 명령어를 안 건드려요. 시스템 콜 직전엔 rax 레지스터에 시스템 콜 번호가 들어있다는 점을 역이용해서, 0번지 근처에 트램펄린(중간 점프대)을 깔아두고 그리로 흘려보내는 똑똑한 트릭이죠.

이번 글의 저자는 여기서 한 걸음 더 나가요. call %rax(레지스터가 가리키는 곳으로) 대신, 메모리 간접 호출(memory-indirect call)call (%rax)(FF 10) 같은 인코딩을 쓰면 어떨까 실험한 거예요. 메모리에 적힌 주소를 한 번 더 따라가는 방식인데, 이게 되면 트램펄린 설계가 더 유연해질 수 있거든요. 제목에 붙은 "negative result(실패한 결과)"가 핵심인데, 인텔 CPU에서는 이 방식이 기대만큼 깔끔하게 동작하지 않더라는 솔직한 기록이에요. 안 되는 걸 안 된다고 공유하는 글도 엄청 귀한 자료죠.

업계 흐름 속에서

요즘 시스템 콜 가로채기는 보안과 격리 분야의 핵심 기술이에요. 구글의 gVisor는 컨테이너를 더 안전하게 격리하려고 시스템 콜을 통째로 가로채고, eBPF는 커널 안에서 안전하게 코드를 실행해 관찰성(observability)을 끌어올리죠. zpoline 계열의 사용자 공간 재작성 기법은 커널 수정 없이도 빠른 후킹을 노리는 흐름이고요. 이번 실험은 그 흐름의 최전선에서 "더 빠르고 유연한 방법 없을까"를 파고드는 시도예요.

한국 개발자에게

당장 실무에 쓸 기법은 아니에요. 하지만 시스템 프로그래밍, 보안, 가상화 쪽에 관심 있다면 이런 저수준 트릭의 사고방식 자체가 큰 공부가 됩니다. "명령어가 2바이트밖에 안 돼서 못 바꾼다고? 그럼 2바이트로 되는 명령어를 찾자"는 발상의 전환이요. 게다가 실패를 공유하는 태도도 배울 만하죠. 우리는 보통 성공한 것만 자랑하지만, 막다른 길을 기록해두면 다음 사람이 같은 벽에 머리를 안 박거든요.

핵심 한 줄: 시스템 콜을 빠르게 가로채려는 저수준 전쟁터에서, 메모리 간접 호출이라는 새 무기를 시험했지만 인텔에선 아직 안 통했다는 솔직한 중간 보고예요.

여러분은 디버깅이나 보안 도구를 만들 때 시스템 콜 후킹을 직접 다뤄본 적 있나요? strace 말고 직접 가로채기를 구현해본 경험이 있다면 어떤 방식을 썼는지 궁금하네요.


🔗 출처: Hacker News

이 뉴스가 유용했나요?

TTJ 코딩클래스 정규반

월급 외 수입,
코딩으로 만들 수 있습니다

17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.

144+실전 강의
17개수익 모델
4.9수강생 평점
정규반 자세히 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.