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

This commit is contained in:
Translator 2024-04-01 08:44:16 +00:00
parent 9f80f9316b
commit 3517b55d79
2 changed files with 32 additions and 29 deletions

View file

@ -2,7 +2,7 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅까지 AWS 해킹 배우기</strong>!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
HackTricks를 지원하는 다른 방법:
@ -10,13 +10,13 @@ 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) 컬렉션
* **💬 [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 저장소에 기여하세요.
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
</details>
## 기본 정보
**Address Space Layout Randomization (ASLR)**은 운영 체제에서 사용되는 보안 기술로, 시스템 및 응용 프로그램 프로세스에서 사용하는 **메모리 주소를 무작위로 변경**합니다. 이렇게 함으로써 특정 프로세스 및 데이터의 위치를 예측하는 것이 상당히 어려워져 공격자가 스택, 힙, 라이브러리 등을 예측하여 특정 유형의 공격(특히 버퍼 오버플로우)을 완화하는 데 도움이 됩니다.
**Address Space Layout Randomization (ASLR)**은 운영 체제에서 사용되는 보안 기술로, 시스템 및 응용 프로그램 프로세스에서 사용하는 **메모리 주소를 무작위로 변경**합니다. 이렇게 함으로써 특정 프로세스 및 데이터의 위치를 예측하는 것이 상당히 어려워지며, 스택, 힙, 라이브러리 등 특정 유형의 공격을 완화하는 데 도움이 됩니다.
### **ASLR 상태 확인**
@ -43,13 +43,13 @@ setarch `uname -m` -R ./bin args
```
### **ASLR 활성화**
ASLR **활성화**하려면 `/proc/sys/kernel/randomize_va_space` 파일에 **2** 값을 작성할 수 있습니다. 일반적으로 루트 권한이 필요합니다. 전체 무작위화를 활성화하려면 다음 명령을 사용할 수 있습니다:
ASLR **활성화**하려면 `/proc/sys/kernel/randomize_va_space` 파일에 **2** 값을 작성할 수 있습니다. 일반적으로 루트 권한이 필요합니다. 전체 무작위화를 활성화하려면 다음 명령을 사용할 수 있습니다:
```bash
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
```
### **부팅 지속성**
### **부팅 지속성**
`echo` 명령어로 한 변경 사항은 일시적이며 재부팅시 초기화됩니다. 변경 사항을 지속적으로 유지하려면 `/etc/sysctl.conf` 파일을 편집하여 다음 라인을 추가하거나 수정해야 합니다:
`echo` 명령어로 한 변경 사항은 일시적이며 재부팅시 초기화됩니다. 변경 사항을 지속적으로 유지하려면 `/etc/sysctl.conf` 파일을 편집하여 다음 을 추가하거나 수정해야 합니다:
```tsconfig
kernel.randomize_va_space=2 # Enable ASLR
# or
@ -68,18 +68,20 @@ sudo sysctl -p
PaX는 프로세스 주소 공간을 **3 그룹**으로 나눕니다:
* **코드와 데이터** (초기화된 및 초기화되지 않은): `.text`, `.data`, 및 `.bss` —> `delta_exec` 변수에서 **16비트**의 엔트로피. 이 변수는 각 프로세스마다 무작위로 초기화되며 초기 주소에 추가됩니다.
* `mmap()` 할당된 **메모리****공유 라이브러리** —> **16비트**, `delta_mmap`이라고 불림.
* **스택** —> **24비트**, `delta_stack`이라고 불림. 그러나 실제로 **11비트**를 사용합니다 (10번째부터 20번째 바이트까지 포함), **16바이트**에 정렬됨 —> 이로 인해 **524,288개의 가능한 실제 스택 주소**가 생성됩니다.
* `mmap()`에 의해 할당된 **메모리****공유 라이브러리** —> **16비트**, `delta_mmap`이라고 .
* **스택** —> **24비트**, `delta_stack`이라고 . 그러나 실제로 **11비트**를 사용합니다 (10번째부터 20번째 바이트까지 포함), **16바이트**에 정렬됨 —> 이로 인해 **524,288개의 가능한 실제 스택 주소**가 생성됩니다.
이전 데이터는 32비트 시스템을 위한 것이며 최종 엔트로피 감소로 인해 ASLR을 우회하여 공격이 성공적으로 완료될 때까지 실행을 여러 번 시도할 수 있습니다.
이전 데이터는 32비트 시스템을 위한 것이며 최종 엔트로피 감소로 인해 공격이 성공적으로 완료될 때까지 실행을 여러 번 시도하여 ASLR을 우회할 수 있습니다.
#### 무차별 대입 아이디어:
* 공격이 로컬인 경우, libc의 기본 주소를 무차별 대입할 수 있습니다 (32비트 시스템에 유용함):
* **쉘코드 앞에 큰 NOP 슬레드를 호스팅할만큼 충분한 오버플로우가 있다면**, 스택 주소를 무차별 대입하여 흐름이 **NOP 슬레드의 일부를 건너뛰도록** 할 수 있습니다.
* 오버플로우가 그리 크지 않고 공격을 로컬에서 실행할 수 있는 경우, **환경 변수에 NOP 슬레드와 쉘코드를 추가**할 수 있습니다.
* 공격이 로컬인 경우, libc의 베이스 주소를 무차별 대입해 볼 수 있습니다 (32비트 시스템에 유용함):
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
* 원격 서버를 공격할 때 `libc` 함수 `usleep`의 주소를 **브루트 포스**하여 10을 인자로 전달할 수 있습니다. 서버가 응답하는 데 10초 더 걸린다면, 이 함수의 주소를 찾은 것입니다.
* 원격 서버를 공격할 때 `libc` 함수 `usleep`의 주소를 **브루트 포스**하여 10을 인자로 전달할 수 있습니다. 서버가 응답하는 데 10초 더 걸린다면 이 함수의 주소를 찾은 것입니다.
{% hint style="success" %}
64비트 시스템에서 엔트로피가 훨씬 높아 이것은 불가능합니다.
@ -87,9 +89,9 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
### 누출이 있는 경우
* **도전 과제는 누출을 제공하는 것입니다**
* **누출이 주어지는 도전**
누출이 주어진 경우 (쉬운 CTF 도전 과제), 해당 누출로부터 오프셋을 계산할 수 있습니다 (예를 들어, 공격 중인 시스템에서 사용되는 정확한 libc 버전을 알고 있다고 가정합니다). 이 예제 exploit은 [**여기의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)에서 추출되었습니다 (자세한 내용은 해당 페이지를 확인하십시오):
누출이 주어진 경우 (쉬운 CTF 도전), 해당 누출로부터 오프셋을 계산할 수 있습니다 (예를 들어 공격 중인 시스템에서 사용되는 정확한 libc 버전을 알고 있다고 가정). 이 예제 exploit은 [**여기의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)에서 추출되었습니다 (자세한 내용은 해당 페이지를 확인하세요):
```python
from pwn import *
@ -124,7 +126,7 @@ p.interactive()
* **Format Strings Arbitrary Read**
ret2plt와 마찬가지로, 포맷 문자열 취약점을 통해 임의의 읽기가 가능하**GOT**에서 **libc 함수**의 주소를 유출할 수 있습니다. 다음은 [**여기에서의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)입니다:
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'|'

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나** **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](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) 컬렉션
* **💬 [**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 저장소에 기여하세요.
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
</details>
@ -18,23 +18,24 @@ HackTricks를 지원하는 다른 방법:
PIE로 컴파일된 이진 파일은 **Position Independent Executable**의 약자로, **프로그램이 실행될 때마다 다른 메모리 위치에 로드**될 수 있어 하드코딩된 주소를 방지합니다.
이진 파일을 이용한 공격의 핵심은 **상대적 주소**를 이용하는 데 있습니다. 프로그램의 부분 간 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE 우회**를 위해서는 **스택**과 같은 취약점을 이용하여 일반적으로 **하나의 주소를 노출**시키면 됩니다. 한 번 주소를 얻으면 **고정된 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
이진 파일을 이용한 공격의 핵심은 **상대적 주소를 이용**하는 데 있습니다. 프로그램의 부분 간 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE 우회**를 위해서는 **스택**과 같은 취약점을 이용하여 주소를 하나 **유출**하면 됩니다. 한 번 주소를 얻으면 **고정된 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
PIE 이진 파일을 공격할 때 유용한 팁은 메모리 페이지가 0x1000 바이트 크기로 무작위화의 단위인 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이 정렬은 올바른 기본 주소가 식별되었는지를 나타내는 것으로, **해킹이 예상대로 작동하지 않을 때 중요한 확인 사항**이 될 수 있습니다.\
또는 이를 이용하여, 주소가 **`0x649e1024`**에 위치한다는 것을 노출하면 **기본 주소가 `0x649e1000`**임을 알 수 있고, 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다.
PIE 이진 파일을 공격할 때 유용한 팁은 메모리 페이지가 0x1000 바이트 크기로 무작위화의 단위인 **기본 주소가 일반적으로 000으로 끝난다**는 것입니다. 이 정렬은 올바른 기본 주소가 식별되었는지를 나타내는 중요한 **검사**가 될 수 있습니다.\
또는 이를 이용하여 **exploit에 사용**할 수 있습니다. 주소가 **`0x649e1024`**에 위치한다는 것을 유출하면 **기본 주소가 `0x649e1000`**임을 알 수 있고 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다.
## 우회 방법
PIE를 우회하기 위해서는 **로드된 이진 파일의 주소를 노출**해야 합니다. 이를 위한 몇 가지 옵션이 있습니다:
PIE를 우회하려면 **로드된 이진 파일의 주소를 유출**해야 합니다. 이를 위한 몇 가지 옵션이 있습니다:
* 노출을 **받은** 경우 (쉬운 CTF 도전 과제에서 일반적, [**이 예제**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)를 확인하세요)
* 스택에서 **올바른 주소를 노출할 때까지 EBP 및 EIP 값을 무차별 대입**:
* **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 이진 파일은 항상 **동일한 주소에 로드**되므로 **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).
* 이진 파일의 주소를 출하기 위해 [**format string**](../../format-strings/)과 같은 임의 읽기 취약점을 사용하여 기본 주소를 얻고 거기서 오프셋을 사용합니다. [**여기에서 예제를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
## 참고 자료
@ -42,14 +43,14 @@ PIE를 우회하기 위해서는 **로드된 이진 파일의 주소를 노출**
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 히어로까지 AWS 해킹을 배우세요**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나** **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](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) 컬렉션
* **💬 [**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 저장소에 기여하세요.
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
</details>