3.8 KiB

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

GEF에서 실행 파일로드한 후 GOT에 있는 함수볼 수 있는지 확인하세요: gef➤ x/20x 0xADDR_GOT

GEF를 사용하여 디버깅 세션을 시작하고 **got**을 실행하여 GOT 테이블을 확인할 수 있습니다:

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}}

참조

{{#include ../../../banners/hacktricks-training.md}}