hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

8.1 KiB

WWW2Exec - GOT/PLT

{% hint style="success" %} AWS 해킹을 배우고 실습하세요: HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹을 배우고 실습하세요: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원
{% endhint %}

기본 정보

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 0xADDR_GOT

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

GOT2Exec

이진 파일에서 GOT에는 함수의 주소 또는 함수 주소를 로드할 PLT 섹션이 포함됩니다. 임의 쓰기의 목표는 나중에 실행될 함수의 GOT 항목을 덮어쓰는 것입니다. 이때 PLT의 system 함수의 주소로 덮어쓰기합니다.

이상적으로, 제어할 수 있는 매개변수로 호출될 함수의 GOT을 덮어쓸 것입니다 (system 함수에 전달할 매개변수를 제어할 수 있게 됩니다).

만약 이진 파일에서 system이 사용되지 않는다면, 시스템 함수에 대한 항목이 PLT에 없을 것입니다. 이러한 시나리오에서는 먼저 system 함수의 주소를 누출하고 그 주소로 GOT를 덮어쓸 필요가 있습니다.

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

libc GOT 항목

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

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

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

Free2system

힙 취약점 CTF에서는 청크 내용을 제어할 수 있고 GOT 테이블을 덮어쓸 수 있는 경우가 많습니다. 사용 가능한 가젯이 없는 경우 free GOT 주소를 system을 가리키도록 덮어쓰고 청크 내부에 "/bin/sh"를 작성하여 해당 청크가 해제될 때 system("/bin/sh")가 실행되도록 하는 간단한 트릭입니다.

Strlen2system

다른 일반적인 기술은 strlen GOT 주소를 **system**을 가리키도록 덮어쓰는 것입니다. 따라서 이 함수가 사용자 입력과 함께 호출되면 문자열 "/bin/sh"를 전달하여 쉘을 얻을 수 있습니다.

또한, 사용자 입력과 함께 puts가 사용되는 경우 strlen GOT 주소를 system을 가리키도록 덮어쓰고 문자열 "/bin/sh"를 전달하여 쉘을 얻을 수 있습니다. 왜냐하면 puts는 사용자 입력과 함께 strlen을 호출하기 때문입니다.

One Gadget

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

힙에서 GOT 남용

힙 취약점에서 RCE를 얻는 일반적인 방법은 fastbin을 남용하여 GOT 테이블 일부를 fast bin에 추가하여 해당 청크가 할당될 때 함수 포인터를 덮어쓸 수 있도록 하는 것입니다. 그런 다음 freesystem으로 지정하고 /bin/sh\x00가 쓰인 청크를 해제하면 쉘을 실행할 수 있습니다.

여기에서 예제를 찾을 수 있습니다.

보호 기능

Full RELRO 보호 기능은 실행 파일이 시작될 때 모든 함수의 주소를 해결하고 이후 GOT 테이블을 읽기 전용으로 만들어 이러한 기술을 방지하기 위한 것입니다:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

참고 자료

{% hint style="success" %} AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기
{% endhint %}