WWW2Exec - GOT/PLT
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
**전역 오프셋 테이블(GOT)**은 동적으로 연결된 바이너리에서 외부 함수의 주소를 관리하는 메커니즘입니다. 이러한 주소는 런타임까지 알 수 없기 때문에(동적 연결로 인해), GOT는 이러한 외부 기호의 주소가 해결된 후 동적으로 업데이트할 수 있는 방법을 제공합니다.
GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. 함수가 처음 호출될 때, 실제 주소는 동적 링커에 의해 해결되어 GOT에 저장됩니다. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다.
**프로시저 링크 테이블(PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하는 트램폴린 역할을 합니다. 바이너리가 외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 GOT에 저장됩니다.
따라서, GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. PLT 항목은 이러한 주소를 동적 링커를 통해 초기 해결하는 데 사용됩니다.
GOT 테이블의 주소를 가져오려면: objdump -s -j .got ./exec
GEF에서 실행 파일을 로드한 후 GOT에 있는 함수를 볼 수 있는지 확인하세요: gef➤ x/20x 0xADDR_GOT
GEF를 사용하여 디버깅 세션을 시작하고 **got
**를 실행하여 GOT 테이블을 확인할 수 있습니다:
바이너리에서 GOT는 함수의 주소 또는 PLT 섹션의 주소를 가지고 있으며, 이 PLT 섹션은 함수 주소를 로드합니다. 이 임의 쓰기의 목표는 나중에 실행될 함수의 GOT 항목을 system
함수의 PLT 주소로 덮어쓰는 것입니다.
이상적으로는, 당신이 제어하는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다(그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다).
만약 system
이 바이너리에서 사용되지 않는다면, 시스템 함수는 PLT에 항목이 없습니다. 이 경우, 먼저 system
함수의 주소를 유출한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다.
PLT 주소는 **objdump -j .plt -d ./vuln_binary
**로 확인할 수 있습니다.
libc의 GOT는 일반적으로 부분 RELRO로 컴파일되어 있어, 그 주소를 알아내는 것이 가능하다면 좋은 목표가 됩니다 (ASLR).
libc의 일반적인 함수는 다른 내부 함수를 호출하며, 이 함수의 GOT는 코드 실행을 얻기 위해 덮어쓸 수 있습니다.
힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있는 것이 일반적이며, 때때로 GOT 테이블을 덮어쓸 수도 있습니다. 가용한 원가젯이 없을 경우 RCE를 얻기 위한 간단한 트릭은 free
GOT 주소를 system
을 가리키도록 덮어쓰고 청크에 "/bin/sh"
를 작성하는 것입니다. 이렇게 하면 이 청크가 해제될 때 system("/bin/sh")
가 실행됩니다.
또 다른 일반적인 기술은 strlen
GOT 주소를 **system
**을 가리키도록 덮어쓰는 것입니다. 따라서 이 함수가 사용자 입력으로 호출되면 문자열 "/bin/sh"
를 전달하여 셸을 얻을 수 있습니다.
게다가, puts
가 사용자 입력으로 사용되면, strlen
GOT 주소를 system
을 가리키도록 덮어쓰고 문자열 "/bin/sh"
를 전달하여 셸을 얻을 수 있습니다. 왜냐하면 puts
가 사용자 입력으로 strlen
을 호출하기 때문입니다.
힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 남용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 이렇게 하면 해당 청크가 할당될 때 일반적으로 free
의 포인터를 덮어쓸 수 있습니다.
그런 다음 free
를 system
을 가리키도록 하고 /bin/sh\x00
가 작성된 청크를 해제하면 셸이 실행됩니다.
전체 RELRO 보호는 이와 같은 기술을 방지하기 위해 설계되었으며, 바이너리가 시작될 때 모든 함수의 주소를 해결하고 그 후 GOT 테이블을 읽기 전용으로 만듭니다:
RelroLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)