1. RTL(Return-to-libc)이란?
RTL은 프로그램에 실행 권한이 없는 스택에서도 원하는 함수를 실행하기 위해, 메모리에 이미 로드된 **공유 라이브러리(libc)**의 함수를 호출하는 기법입니다. 주로 스택에서의 코드 실행을 막는 NX-bit 보호 기법을 우회할 때 사용됩니다.
핵심 개념: PLT와 GOT
RTL을 이해하려면 함수 호출의 징검다리 역할을 하는 두 테이블을 알아야 합니다.
- PLT (Procedure Linkage Table): 외부 함수로 점프하기 위한 실제 코드 영역(Trampoline)입니다.
- GOT (Global Offset Table): 함수의 실제 주소가 저장되는 보관소입니다.
- 흐름: 함수를 처음 호출하면 라이브러리에서 주소를 찾아 GOT에 기록하고, 이후에는 기록된 주소를 참조하여 바로 실행합니다.
2. 64bit RTL의 핵심: Calling Convention의 변화
32bit와 64bit RTL의 가장 결정적인 차이는 인자(Argument) 전달 방식에 있습니다.
32bit vs 64bit 비교
- 32bit (x86): 모든 인자를 **스택(Stack)**에 쌓아서 전달합니다. 따라서 가젯 없이도 스택 구성만으로 인자 세팅이 가능합니다.
- 64bit (x64): 인자를 **레지스터(Register)**에 담아 전달합니다.
- 첫 번째 인자부터 RDI, RSI, RDX, RCX, R8, R9 순으로 사용됩니다.
3. 왜 64bit에서는 가젯(Gadget)이 필수인가?
64bit 환경에서는 인자가 레지스터에 들어가야 하므로, 단순히 스택에 주소를 적는 것만으로는 함수를 정상적으로 호출할 수 없습니다. 이때 필요한 것이 가젯(Gadget)입니다.
- 가젯이란? pop rdi; ret과 같이 레지스터에 값을 넣고 리턴하는 코드 조각입니다.
- 역할: 스택에 적어둔 인자 값을 pop 하여 레지스터(RDI 등)로 옮겨주는 역할을 수행합니다.
- 찾는 법: ROPgadget 도구를 사용하여 바이너리 내에서 필요한 가젯을 검색합니다.
4. 익스플로잇 시나리오 설계
system("/bin/sh")를 실행하기 위한 64bit RTL 페이로드 구조는 다음과 같습니다.
페이로드 구성 (Payload)
- Dummy: buf 크기 + SFP(8byte)만큼 채웁니다.
- pop rdi; ret 가젯 주소: 실행 흐름을 가젯으로 돌립니다.
- "/bin/sh" 문자열 주소: 가젯에 의해 RDI 레지스터에 들어갈 첫 번째 인자 값입니다.
- system() 함수 PLT 주소: 인자가 세팅된 상태에서 실제 함수를 호출합니다.

주의사항: movaps 이슈 (Stack Alignment)
최신 64bit 환경(Ubuntu 등)에서는 system 함수 내부에서 movaps 명령어가 스택이 16바이트 단위로 정렬되어 있는지 검사합니다.
- 만약 인자 세팅이 완벽한데도 SIGSEGV가 발생한다면, 페이로드 중간에 의미 없는 ret 가젯을 하나 더 추가하여 스택 높이를 맞춤으로써 해결할 수 있습니다.
5. 실습 문제
https://dreamhack.io/wargame/challenges/353
로그인 | Dreamhack
페르소나 굿즈 이벤트 기간 한정 구독 혜택 지금 가입하면 연간 플랜을 최대 75% 할인 된 가격으로!
dreamhack.io
[시스템 해킹] Return to Library write up
https://dreamhack.io/wargame/challenges/353 로그인 | Dreamhack페르소나 굿즈 이벤트 기간 한정 구독 혜택 지금 가입하면 연간 플랜을 최대 75% 할인 된 가격으로!dreamhack.io0. 보안기법 확인NX bit와 canary가 켜져
seowoo-j.tistory.com
'설명' 카테고리의 다른 글
| NX-bit를 우회하는 RTL (Return-To-Libc) 공격 기법 (32-bit) (0) | 2026.01.18 |
|---|---|
| 시스템 해킹 입문: Buffer Overflow와 스택 메모리 구조 (0) | 2026.01.16 |
| Mac에서 CTF / pwn 실습용 원격 개발 환경 구축 (0) | 2026.01.15 |
| SSTI(Server-Side Template Injection)와 Python RCE 원리 (0) | 2026.01.09 |
| Web Shell과 Reverse Shell (0) | 2026.01.05 |