mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
65 lines
3.8 KiB
Markdown
65 lines
3.8 KiB
Markdown
# AW2Exec - GOT/PLT
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## **기본 정보**
|
|
|
|
### **GOT: 전역 오프셋 테이블**
|
|
|
|
**전역 오프셋 테이블 (GOT)**은 동적으로 연결된 바이너리에서 **외부 함수의 주소**를 관리하는 메커니즘입니다. 이러한 **주소는 런타임까지 알려지지 않기 때문에** (동적 연결로 인해), GOT는 **이 외부 기호의 주소를 동적으로 업데이트하는 방법**을 제공합니다.
|
|
|
|
GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. **함수가 처음 호출될 때, 그 실제 주소는 동적 링커에 의해 해결되어 GOT에 저장됩니다**. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다.
|
|
|
|
### **PLT: 프로시저 링크 테이블**
|
|
|
|
**프로시저 링크 테이블 (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다**. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 GOT에 저장됩니다.
|
|
|
|
**따라서,** GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. **PLT 항목은 이러한 주소의 초기 해결을 동적 링커를 통해 용이하게 하기 위해 사용됩니다.**
|
|
|
|
## 실행 가져오기
|
|
|
|
### GOT 확인
|
|
|
|
GOT 테이블의 주소를 가져오려면: **`objdump -s -j .got ./exec`**
|
|
|
|
.png>)
|
|
|
|
GEF에서 **실행 파일**을 **로드**한 후 **GOT**에 있는 **함수**를 **볼 수 있는지** 확인하세요: `gef➤ x/20x 0xADDR_GOT`
|
|
|
|
 (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) (1) (1) (1) (1) (1) (1) (5).png>)
|
|
|
|
GEF를 사용하여 **디버깅** 세션을 **시작**하고 **`got`**을 실행하여 GOT 테이블을 확인할 수 있습니다:
|
|
|
|
.png>)
|
|
|
|
### GOT2Exec
|
|
|
|
바이너리에서 GOT는 **함수의 주소** 또는 **PLT** 섹션의 주소를 가지고 있습니다. 이 임의 쓰기의 목표는 **나중에 실행될 함수의 GOT 항목을** **`system`** **함수의 PLT 주소**로 **덮어쓰는** 것입니다.
|
|
|
|
이상적으로는, **당신이 제어하는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다** (그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다).
|
|
|
|
**`system`** **이 스크립트에서 사용되지 않는 경우**, 시스템 함수는 PLT에 항목이 **없습니다**. 이 시나리오에서는 먼저 `system` 함수의 주소를 **유출**한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다.
|
|
|
|
PLT 주소는 **`objdump -j .plt -d ./vuln_binary`**로 확인할 수 있습니다.
|
|
|
|
## **원 가젯**
|
|
|
|
{{#ref}}
|
|
../one-gadget.md
|
|
{{#endref}}
|
|
|
|
## **보호**
|
|
|
|
**전체 RELRO** 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 그 후 **GOT 테이블을 읽기 전용**으로 만들어 이러한 종류의 기술로부터 보호하기 위해 설계되었습니다:
|
|
|
|
{{#ref}}
|
|
../common-binary-protections-and-bypasses/relro.md
|
|
{{#endref}}
|
|
|
|
## 참조
|
|
|
|
- [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)
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|