WWW2Exec - .dtors & .fini_array

HackTricks 지원하기

.dtors

요즘에는 .dtors 섹션을 포함한 이진 파일을 찾기가 매우 이상합니다!

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

이 섹션의 주소를 가져오려면:

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

보통 DTOR 마커를 **ffffffff**와 00000000 값 사이에 찾을 수 있습니다. 그러므로 이 값들만 보인다면, 등록된 함수가 없다는 것을 의미합니다. 따라서 **00000000**을 쉘코드의 주소로 덮어씌우세요.

물론, 나중에 호출하기 위해 쉘코드를 저장할 곳을 먼저 찾아야합니다.

.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**이 자신을 다시 호출하여 .fini_array 함수를 다시 실행하게 만듭니다. 이는 취약한 WWW 함수를 2번 호출하게 하며, 하나는 임의 쓰기를 위한 것이고 다른 하나는 다시 **__libc_csu_fini**의 반환 주소를 덮어쓰기 위해 스택에 자신을 다시 호출합니다.

Full RELRO로, .fini_array 섹션이 읽기 전용으로 만들어집니다. 새로운 버전에서는 [Partial RELRO]로도 .fini_array 섹션이 읽기 전용으로 만들어집니다.

HackTricks 지원

Last updated