hacktricks/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

3.9 KiB

WWW2Exec - .dtors & .fini_array

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

.dtors

{% hint style="danger" %} 요즘에는 .dtors 섹션을 포함한 이진 파일을 찾는 것이 매우 이상합니다! {% endhint %}

소멸자는 프로그램이 종료되기 전에 실행되는 함수입니다 (main 함수가 반환된 후).
이러한 함수들의 주소는 이진 파일의 .dtors 섹션에 저장되어 있으며, 따라서 **__DTOR_END__**에 쉘코드 주소를 쓰면 프로그램이 종료되기 전에 실행됩니다.

다음 명령어로 이 섹션의 주소를 가져옵니다:

objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

일반적으로 DTOR 마커는 값 ffffffff00000000 사이에 있습니다. 따라서 이 값만 보인다면, 등록된 함수가 없다는 것을 의미합니다. 따라서 **00000000**을 쉘코드의 주소덮어쓰세요.

{% hint style="warning" %} 물론, 나중에 호출하기 위해 쉘코드를 저장할 위치를 먼저 찾아야 합니다. {% endhint %}

.fini_array

이것은 프로그램이 종료되기 전에 호출되는 함수를 포함하는 구조체입니다. 이는 **.dtors**와 유사합니다. 이는 주소로 점프하여 쉘코드를 호출하거나 취약점을 두 번째로 이용하기 위해 다시 main으로 돌아가야 하는 경우에 흥미로울 수 있습니다.

objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

무한 루프

**.fini_array**에서 함수가 실행될 때 다음 함수로 이동하므로 여러 번 실행되지 않습니다(무한 루프 방지), 그러나 여기에는 함수의 실행을 1회만 제공합니다.

**.fini_array**의 항목은 역순으로 호출되므로 마지막 항목부터 쓰기를 시작하는 것이 좋습니다.

**__libc_csu_fini**에 의해 저장된 스택의 반환 주소를 계산하고 **__libc_csu_fini**의 주소를 거기에 넣으면 다음을 수행할 수 있습니다:

  • 취약한 임의 쓰기 함수를 호출하기 위해 첫 번째 쓰기를 사용합니다.
  • 이후 **__libc_csu_fini**가 호출하는 함수인 **__libc_csu_fini**의 주소를 스택에 다시 덮어씁니다.
  • 이렇게 하면 **__libc_csu_fini**가 자신을 다시 호출하여 .fini_array 함수를 다시 실행하게 만들어 취약한 WWW 함수를 2번 호출하게 됩니다: 하나는 임의 쓰기를 위해이고 다른 하나는 다시 **__libc_csu_fini**의 반환 주소를 덮어쓰기하여 자체를 다시 호출합니다.

{% hint style="danger" %} Full RELRO로 설정된 경우 .fini_array 섹션이 읽기 전용으로 만들어집니다. {% endhint %}