WWW2Exec - GOT/PLT
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
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) (2) (2) (2).png)
GEF를 사용하여 디버깅 세션을 시작하고 **got**를 실행하여 GOT 테이블을 확인할 수 있습니다:
.png)
GOT2Exec
바이너리에서 GOT는 함수의 주소 또는 함수 주소를 로드할 PLT 섹션의 주소를 가지고 있습니다. 이 임의 쓰기의 목표는 나중에 실행될 함수의 GOT 항목을 system 함수의 PLT 주소로 덮어쓰는 것입니다.
이상적으로는, 당신이 제어하는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다(그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다).
만약 system 이 바이너리에서 사용되지 않는다면, 시스템 함수는 PLT에 항목이 없을 것입니다. 이 시나리오에서는 먼저 system 함수의 주소를 유출한 후 GOT를 이 주소를 가리키도록 덮어써야 합니다.
PLT 주소는 **objdump -j .plt -d ./vuln_binary**로 확인할 수 있습니다.
libc GOT 항목
libc의 GOT는 일반적으로 부분 RELRO로 컴파일되어, 그 주소를 파악할 수 있다면 좋은 목표가 됩니다 (ASLR).
libc의 일반적인 함수는 다른 내부 함수를 호출할 것이며, 이 함수의 GOT는 코드 실행을 얻기 위해 덮어쓸 수 있습니다.
Free2system
힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있는 것이 일반적이며, 때때로 GOT 테이블을 덮어쓸 수 있습니다. 가젯이 사용 불가능할 경우 RCE를 얻기 위한 간단한 트릭은 free GOT 주소를 system을 가리키도록 덮어쓰고 청크에 "/bin/sh"를 작성하는 것입니다. 이렇게 하면 이 청크가 해제될 때 system("/bin/sh")가 실행됩니다.
Strlen2system
또 다른 일반적인 기술은 strlen GOT 주소를 **system**을 가리키도록 덮어쓰는 것입니다. 따라서 이 함수가 사용자 입력으로 호출되면 문자열 "/bin/sh"를 전달하여 셸을 얻을 수 있습니다.
게다가, puts가 사용자 입력과 함께 사용되면, strlen GOT 주소를 system을 가리키도록 덮어쓰고 문자열 "/bin/sh"를 전달하여 셸을 얻을 수 있습니다. 왜냐하면 puts는 사용자 입력으로 strlen을 호출하기 때문입니다.
One Gadget
힙에서 GOT 남용하기
힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 남용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 따라서 해당 청크가 할당될 때 일반적으로 free의 포인터를 덮어쓸 수 있습니다.
그런 다음 free를 system을 가리키도록 하고 /bin/sh\x00가 작성된 청크를 해제하면 셸이 실행됩니다.
보호
Full RELRO 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 GOT 테이블을 읽기 전용으로 만드는 방식으로 이러한 종류의 기술을 방지하기 위해 설계되었습니다:
참고 문헌
- 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
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks

