mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
113 lines
8.1 KiB
Markdown
113 lines
8.1 KiB
Markdown
# WWW2Exec - GOT/PLT
|
|
|
|
{% hint style="success" %}
|
|
AWS 해킹을 배우고 실습하세요: <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">\
|
|
GCP 해킹을 배우고 실습하세요: <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>HackTricks 지원</summary>
|
|
|
|
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* 💬 [**디스코드 그룹**](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>
|
|
{% endhint %}
|
|
|
|
## **기본 정보**
|
|
|
|
### **GOT: Global Offset Table**
|
|
|
|
**Global Offset Table (GOT)**은 동적으로 링크된 이진 파일에서 **외부 함수의 주소를 관리하는 메커니즘**입니다. 이러한 **주소는 실행 시간까지 알려지지 않습니다** (동적 링킹으로 인해), GOT은 이러한 외부 심볼의 주소를 **동적으로 업데이트**하는 방법을 제공합니다.
|
|
|
|
GOT의 각 항목은 이진 파일이 호출할 수 있는 외부 라이브러리의 심볼에 해당합니다. **함수가 처음 호출될 때 동적 링커에 의해 실제 주소가 해결되고 GOT에 저장**됩니다. 동일한 함수에 대한 후속 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다.
|
|
|
|
### **PLT: Procedure Linkage Table**
|
|
|
|
**Procedure Linkage Table (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출하면 해당 함수와 관련된 PLT 항목으로 제어가 전달**됩니다. 이 PLT 항목은 주소가 이미 해결되지 않은 경우 동적 링커를 호출하여 함수의 주소를 해결합니다. 주소가 해결되면 GOT에 저장됩니다.
|
|
|
|
**따라서,** 외부 함수나 변수의 주소가 해결되면 GOT 항목이 직접 사용됩니다. **PLT 항목은 동적 링커를 통해 이러한 주소의 초기 해결을 용이하게 합니다**.
|
|
|
|
## 실행 얻기
|
|
|
|
### GOT 확인
|
|
|
|
**`objdump -s -j .got ./exec`**를 사용하여 GOT 테이블의 주소를 얻습니다.
|
|
|
|
![](<../../.gitbook/assets/image (121).png>)
|
|
|
|
GEF에서 **실행 파일을 로드한 후** GOT에 있는 **함수를 볼 수 있습니다**: `gef➤ x/20x 0xADDR_GOT`
|
|
|
|
![](<../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
|
|
|
|
GEF를 사용하여 **디버깅 세션을 시작**하고 **`got`**을 실행하여 got 테이블을 볼 수 있습니다.
|
|
|
|
![](<../../.gitbook/assets/image (496).png>)
|
|
|
|
### GOT2Exec
|
|
|
|
이진 파일에서 GOT에는 **함수의 주소 또는** 함수 주소를 로드할 **PLT** 섹션이 포함됩니다. 임의 쓰기의 목표는 나중에 **실행될 함수의 GOT 항목을 덮어쓰는 것**입니다. 이때 PLT의 **`system` 함수의 주소로 덮어쓰기**합니다.
|
|
|
|
이상적으로, **제어할 수 있는 매개변수로 호출될 함수의 GOT을 덮어쓸 것**입니다 (`system` 함수에 전달할 매개변수를 제어할 수 있게 됩니다).
|
|
|
|
만약 이진 파일에서 **`system`이 사용되지 않는다면**, 시스템 함수에 대한 항목이 PLT에 없을 것입니다. 이러한 시나리오에서는 먼저 `system` 함수의 주소를 누출하고 그 주소로 GOT를 덮어쓸 필요가 있습니다.
|
|
|
|
**`objdump -j .plt -d ./vuln_binary`**를 사용하여 PLT 주소를 볼 수 있습니다.
|
|
|
|
## libc GOT 항목
|
|
|
|
**libc의 GOT**은 일반적으로 **부분 RELRO**로 컴파일되어 있어서 주소를 알아내는 것이 가능하다면 좋은 대상이 됩니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)을 우회하는 것이 가능한 경우).
|
|
|
|
libc의 일반 함수들은 **다른 내부 함수를 호출**하게 되며, 이러한 GOT를 덮어쓰면 코드 실행이 가능해질 수 있습니다.
|
|
|
|
이 기술에 대한 [**자세한 정보는 여기에서 확인하세요**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
|
|
|
### **Free2system**
|
|
|
|
힙 취약점 CTF에서는 청크 내용을 제어할 수 있고 GOT 테이블을 덮어쓸 수 있는 경우가 많습니다. 사용 가능한 가젯이 없는 경우 `free` GOT 주소를 `system`을 가리키도록 덮어쓰고 청크 내부에 `"/bin/sh"`를 작성하여 해당 청크가 해제될 때 `system("/bin/sh")`가 실행되도록 하는 간단한 트릭입니다.
|
|
|
|
### **Strlen2system**
|
|
|
|
다른 일반적인 기술은 **`strlen`** GOT 주소를 **`system`**을 가리키도록 덮어쓰는 것입니다. 따라서 이 함수가 사용자 입력과 함께 호출되면 문자열 `"/bin/sh"`를 전달하여 쉘을 얻을 수 있습니다.
|
|
|
|
또한, 사용자 입력과 함께 `puts`가 사용되는 경우 `strlen` GOT 주소를 `system`을 가리키도록 덮어쓰고 문자열 `"/bin/sh"`를 전달하여 쉘을 얻을 수 있습니다. 왜냐하면 **`puts`는 사용자 입력과 함께 `strlen`을 호출**하기 때문입니다.
|
|
|
|
## **One Gadget**
|
|
|
|
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
|
|
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
|
{% endcontent-ref %}
|
|
|
|
## **힙에서 GOT 남용**
|
|
|
|
힙 취약점에서 RCE를 얻는 일반적인 방법은 fastbin을 남용하여 GOT 테이블 일부를 fast bin에 추가하여 해당 청크가 할당될 때 함수 포인터를 덮어쓸 수 있도록 하는 것입니다. 그런 다음 `free`를 `system`으로 지정하고 `/bin/sh\x00`가 쓰인 청크를 해제하면 쉘을 실행할 수 있습니다.
|
|
|
|
[**여기에서 예제를 찾을 수 있습니다**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13).
|
|
## **보호 기능**
|
|
|
|
**Full RELRO** 보호 기능은 실행 파일이 시작될 때 모든 함수의 주소를 해결하고 이후 **GOT 테이블을 읽기 전용**으로 만들어 이러한 기술을 방지하기 위한 것입니다:
|
|
|
|
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
|
|
[relro.md](../common-binary-protections-and-bypasses/relro.md)
|
|
{% endcontent-ref %}
|
|
|
|
## 참고 자료
|
|
|
|
* [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
|
|
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
|
|
|
{% hint style="success" %}
|
|
AWS 해킹 학습 및 실습:<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">\
|
|
GCP 해킹 학습 및 실습: <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>HackTricks 지원하기</summary>
|
|
|
|
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
|
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
|
|
|
|
</details>
|
|
{% endhint %}
|