Translated ['binary-exploitation/common-binary-protections-and-bypasses/

This commit is contained in:
Translator 2024-08-12 13:17:29 +00:00
parent 79f1657871
commit f872cab7f8

View file

@ -1,25 +1,59 @@
# Relro
**RELRO**는 **Relocation Read-Only**의 약자로, **GOT (Global Offset Table)** 덮어쓰기와 관련된 위험을 완화하기 위해 이진 파일에서 사용되는 보안 기능입니다. 이 개념을 명확히 하기 위해 두 가지 유형으로 나누어 살펴보겠습니다: **Partial RELRO**와 **Full RELRO**.
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Relro
**RELRO**는 **Relocation Read-Only**의 약자로, **GOT (Global Offset Table)** 오버라이트와 관련된 위험을 완화하기 위해 바이너리에서 사용되는 보안 기능입니다. **RELRO** 보호에는 두 가지 유형이 있습니다: (1) **Partial RELRO**와 (2) **Full RELRO**. 두 가지 모두 ELF 파일의 **GOT**와 **BSS**를 재배치하지만, 결과와 의미는 다릅니다. 구체적으로, **GOT** 섹션을 **BSS**보다 *앞에* 배치합니다. 즉, **GOT**는 **BSS**보다 낮은 주소에 위치하므로, **BSS**의 변수를 오버플로우하여 **GOT** 항목을 덮어쓰는 것이 불가능합니다 (메모리에 쓰는 것은 낮은 주소에서 높은 주소로 진행됩니다).
명확성을 위해 이 개념을 두 가지 유형으로 나누어 보겠습니다.
### **Partial RELRO**
**Partial RELRO**는 이진 파일의 성능에 큰 영향을 미치지 않으면서 보안을 강화하는 간단한 방법을 취합니다. **메모리에서 프로그램 변수 위에 GOT를 배치함으로써 Partial RELRO는 버퍼 오버플로가 GOT에 도달하고 GOT를 손상시키는 것을 방지하려고 합니다**.
**Partial RELRO**는 바이너리의 성능에 큰 영향을 주지 않으면서 보안을 강화하는 간단한 접근 방식을 취합니다. Partial RELRO는 **.got을 읽기 전용으로 만듭니다 (GOT 섹션의 비-PLT 부분)**. 나머지 섹션(예: .got.plt)은 여전히 쓰기가 가능하므로 공격의 대상이 될 수 있습니다. 이는 **GOT**가 **임의 쓰기** 취약점으로 악용되는 것을 방지하지 않습니다.
이는 **임의 쓰기** 취약점으로부터 GOT가 남용되는 것을 방지하지는 않습니다.
참고: 기본적으로 GCC는 Partial RELRO로 바이너리를 컴파일합니다.
### **Full RELRO**
**Full RELRO**는 **GOT와 .fini\_array** 섹션을 완전히 **읽기 전용**으로 만들어 더 나은 보호를 제공합니다. 이진 파일이 시작되면 모든 함수 주소가 해결되어 GOT에 로드되고, 그런 다음 GOT가 읽기 전용으로 표시되어 실행 중에 이에 대한 수정을 방지합니다.
**Full RELRO**는 **전체 GOT (both .got and .got.plt)와 .fini\_array** 섹션을 완전히 **읽기 전용**으로 만들어 보호를 강화합니다. 바이너리가 시작되면 모든 함수 주소가 해결되고 GOT에 로드된 후, GOT는 읽기 전용으로 표시되어 런타임 중에 수정이 효과적으로 방지됩니다.
그러나 Full RELRO의 단점은 성능과 시작 시간 측면에서 발생합니다. GOT를 읽기 전용으로 표시하기 전에 시작 시 모든 동적 심볼을 해결해야 하기 때문에 **Full RELRO가 활성화된 바이너리는 더 긴 로드 시간을 경험할 수 있습니다**. 이 추가적인 시작 오버헤드로 인해 Full RELRO는 모든 이진 파일에서 기본적으로 활성화되지 않습니다.
그러나 Full RELRO의 단점은 성능과 시작 시간에 있습니다. GOT를 읽기 전용으로 표시하기 전에 모든 동적 심볼을 시작 시 해결해야 하므로, **Full RELRO가 활성화된 바이너리는 로드 시간이 더 길어질 수 있습니다**. 이 추가 시작 오버헤드 때문에 Full RELRO는 모든 바이너리에서 기본적으로 활성화되지 않습니다.
바이너리에서 Full RELRO가 **활성화되어 있는지 확인**하는 방법은 다음과 같습니다:
Full RELRO가 **활성화**되어 있는지 확인하는 방법은 다음과 같습니다:
```bash
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
```
## 우회
## Bypass
만약 Full RELRO가 활성화되어 있다면, 임의 실행을 얻기 위해 GOT 테이블에 쓰지 않아도 되는 다른 방법을 찾아야 합니다.
Full RELRO가 활성화된 경우, 이를 우회하는 유일한 방법은 GOT 테이블에 쓰지 않고 임의 실행을 얻는 다른 방법을 찾는 것입니다.
**LIBC의 GOT는 일반적으로 Partial RELRO**이므로 임의 쓰기로 수정할 수 있습니다. 자세한 정보는 [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)**에서 확인할 수 있습니다.**
**LIBC의 GOT는 일반적으로 Partial RELRO이므로**, 임의 쓰기로 수정할 수 있습니다. [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)**에서 더 많은 정보를 확인하세요.**
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}