WWW2Exec - GOT/PLT

제로부터 히어로가 되기까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team 전문가)!

HackTricks를 지원하는 다른 방법:

기본 정보

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 테이블의 주소를 얻습니다.

GEF에서 실행 파일을 로드한 후 GOT에 있는 함수를 볼 수 있습니다: gef➤ x/20x 0xDIR_GOT

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

GOT2Exec

바이너리에서 GOT에는 함수의 주소 또는 함수 주소를 로드할 PLT 섹션이 포함되어 있습니다. 이 임의 쓰기의 목표는 나중에 실행될 함수의 GOT 항목을 덮어쓰는 것입니다. 이때 예를 들어 system 함수의 PLT 주소로 덮어쓰게 됩니다.

이상적으로, 제어할 수 있는 매개변수로 호출될 함수의 GOT를 덮어쓸 것입니다 (따라서 시스템 함수로 전송되는 매개변수를 제어할 수 있게 됩니다).

system 스크립트에서 사용되지 않는 경우 시스템 함수에는 PLT에 항목이 없을 것입니다. 이 시나리오에서는 먼저 system 함수의 주소를 누출하고 그 주소를 가리키도록 GOT를 덮어쓸 필요가 있습니다.

**objdump -j .plt -d ./vuln_binary**를 사용하여 PLT 주소를 볼 수 있습니다.

libc GOT 항목

libc의 GOT은 일반적으로 부분 RELRO로 컴파일되어 있어서 주소를 알아내는 것이 가능하다면 (ASLR) 이 기법에 좋은 대상이 됩니다.

libc의 일반 함수는 다른 내부 함수를 호출할 것이며, 이러한 GOT를 덮어쓰면 코드 실행이 가능해질 수 있습니다.

이 기술에 대한 자세한 정보는 여기에서 확인하세요.

One Gadget

pageOne Gadget

보호 기능

Full RELRO 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 GOT 테이블을 읽기 전용으로 만들어 이러한 기술에 대한 보호를 제공합니다:

pageRelro

참고 자료

제로부터 히어로가 되기까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team 전문가)!

HackTricks를 지원하는 다른 방법:

Last updated