🔍 return address vs ret 가젯 – 차이점과 관계
💡 이 두 개념은 밀접하게 연관되어 있지만 다릅니다.
✔ return address: 함수가 끝난 후 어디로 돌아갈지 저장된 주소
✔ ret 가젯: 스택에서 return address를 꺼내 실행하는 명령어
🚖 비유하자면?
- return address = 내비게이션 목적지 (택시가 가야 할 주소)
- ret 가젯 = 택시 기사가 목적지로 출발하는 행동
🛣️ 1️⃣ return address란?
📌 함수를 호출하면 CPU는 다음 명령을 어디서 실행해야 하는지 알아야 함.
💡 그래서 함수가 실행되기 전에, 원래 실행하던 위치(RIP)를 스택에 저장함.
✔ 예제: 함수 호출 후 return address 저장
call some_function
- call 명령어가 실행되면, **다음 실행할 명령어의 주소(RIP)**를 스택에 저장.
- 함수 실행이 끝나면, ret을 만나고 스택에 저장된 return address로 복귀.
📌 스택에 저장된 return address 예시
스택 주소 값
0x7fffffffde80 | 0x401080 (return address) |
0x7fffffffde78 | 0x7ffff7e2d9d0 (이전 RBP) |
✔ 즉, return address는 함수가 끝나면 돌아가야 할 곳을 나타냄.
✔ 이 주소를 우리가 ROP로 조작할 수 있음! (BOF 발생 시 덮어쓰기)
🔁 2️⃣ ret 가젯이 하는 역할
💡 ret 명령어는 return address를 찾아 실행하는 역할을 함.
📌 기본적인 ret 동작
ret
- 스택의 최상단에서 return address를 꺼내 RIP(Instruction Pointer)로 이동.
📌 ret 실행 과정 1️⃣ ret 실행 → return address를 스택에서 꺼냄
2️⃣ RIP를 해당 주소로 설정하여 실행
3️⃣ 프로그램이 원래 함수 호출 위치로 돌아감
💡 즉, ret은 "이제 어디로 갈지" 결정하는 역할을 함!
🚖 3️⃣ return address와 ret의 관계
📌 정상적인 함수 호출 흐름
call some_function ; 1️⃣ 함수 호출
...
ret ; 2️⃣ 스택에서 return address를 가져와 실행
✔ return address는 어디로 돌아갈지 저장된 주소
✔ ret은 그 주소를 가져와 실행하는 역할
💥 4️⃣ BOF(버퍼 오버플로우)에서 return address를 조작하면?
💡 BOF 발생 시 return address를 우리가 원하는 곳으로 바꿀 수 있음!
- 프로그램이 원래 함수로 돌아가는 대신, 해커가 원하는 주소로 점프함! 🚀
📌 BOF 공격 과정 1️⃣ 입력 크기를 초과하여 return address를 덮어쓰기
2️⃣ 원래 가야 할 곳이 아니라 system("/bin/sh") 주소를 넣음
3️⃣ ret이 실행되면 system("/bin/sh")이 호출됨! 🎯
✔ 이게 바로 ROP 공격의 핵심 원리!
💡 5️⃣ return address와 ret이 어떻게 함께 사용되는지
✅ 1. 원래 동작 (정상적인 함수 실행)
🚕 택시(프로그램 실행)
- return address = 택시 목적지
- ret = 택시 기사가 목적지로 출발하는 행동
📌 정상적인 흐름
- 함수 실행 → return address 저장 (call some_function)
- 함수 종료 → ret 실행 → 원래 위치로 복귀
✔ 🚖 올바른 길을 따라감 (정상 실행)
✅ 2. BOF(ROP 공격) 발생 시
🚨 택시 해킹 (return address 조작!)
- 해커가 return address를 덮어 씀 → 택시가 엉뚱한 곳으로 감!
- ret을 실행하면, 해커가 지정한 주소로 이동!
📌 ROP 공격 흐름
- BOF 발생 → return address를 system("/bin/sh")으로 덮음
- ret 실행 → 원래 위치가 아니라 system("/bin/sh") 실행됨!
✔ 🚖 택시가 해커가 원하는 곳으로 이동! (쉘 획득) 🚀🔥
📌 6️⃣ 정리
✅ return address = 함수가 끝난 후 어디로 돌아갈지 저장된 주소
✅ ret = 스택에서 return address를 꺼내 실행하는 명령어
✅ BOF가 발생하면 return address를 해커가 원하는 주소로 바꿀 수 있음!
✅ ret을 실행하면 system("/bin/sh")을 실행하도록 조작 가능! 🚀
🚀 최종 결론
✔ return address가 네비게이션 목적지라면, ret은 출발 버튼이다!
✔ BOF로 return address를 조작하면, ret이 실행되면서 원하는 곳으로 이동할 수 있다!
💡 이제 return address와 ret의 관계를 완벽히 이해했어요! 👏👏
🔥 이제 Pwndbg로 디버깅하면서 실제로 동작을 확인하면 완벽하게 마스터할 수 있어요! 🚀
'Study > System' 카테고리의 다른 글
왜 BOF로 return address를 덮어 씌울까? (0) | 2025.02.24 |
---|---|
ROP(Return-Oriented Programming) (0) | 2025.02.24 |
ret(return) 가젯 (0) | 2025.02.24 |
가젯(Gadget) (0) | 2025.02.24 |
RWX메모리를 만드는 mprotect(), mmap() (1) | 2025.02.22 |