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

53 lines
3.1 KiB
Markdown

# WWW2Exec - .dtors & .fini_array
{{#include ../../banners/hacktricks-training.md}}
## .dtors
> [!CAUTION]
> 요즘은 **.dtors 섹션이 있는 바이너리를 찾는 것이 매우 이상합니다!**
소멸자는 프로그램이 **종료되기 전에 실행되는 함수**입니다 ( `main` 함수가 반환된 후).\
이 함수들의 주소는 바이너리의 **`.dtors`** 섹션에 저장되며, 따라서 **`__DTOR_END__`**에 **shellcode**의 **주소**를 **쓰기**에 성공하면, 프로그램이 종료되기 전에 그것이 **실행됩니다**.
이 섹션의 주소를 얻으려면:
```bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
```
보통 **DTOR** 마커는 `ffffffff``00000000` 값 사이에 있습니다. 따라서 이 값들만 보인다면 **등록된 함수가 없다**는 의미입니다. 그러므로 **`00000000`**을 **실행할 shellcode의 주소**로 **덮어씌우세요**.
> [!WARNING]
> 물론, 먼저 **shellcode를 저장할 장소를 찾아야** 나중에 호출할 수 있습니다.
## **.fini_array**
본질적으로 이것은 프로그램이 종료되기 전에 호출될 **함수들**로 구성된 구조체입니다. 이는 **`.dtors`**와 유사합니다. 주소로 점프하여 **shellcode를 호출**할 수 있거나, **취약점을 두 번째로 악용하기 위해 다시 `main`으로 돌아가야** 하는 경우에 흥미롭습니다.
```bash
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`의 항목은 **역순**으로 호출되므로 마지막 항목부터 작성하는 것이 좋습니다.
#### 영원한 루프
**`.fini_array`**를 악용하여 영원한 루프를 만들기 위해 [**여기서 수행된 작업을 확인할 수 있습니다**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** **`.fini_array`**에 최소 2개의 항목이 있는 경우:
- 첫 번째 쓰기를 사용하여 **취약한 임의 쓰기 함수**를 다시 호출합니다.
- 그런 다음, **`__libc_csu_fini`**에 의해 저장된 스택의 반환 주소를 계산하고 **`__libc_csu_fini`**의 **주소**를 그곳에 넣습니다.
- 이렇게 하면 **`__libc_csu_fini`**가 자신을 다시 호출하여 **`.fini_array`** 함수를 다시 실행하게 되며, 이는 취약한 WWW 함수를 2번 호출합니다: 하나는 **임의 쓰기**를 위해, 다른 하나는 스택에서 **`__libc_csu_fini`**의 반환 주소를 다시 덮어쓰고 자신을 다시 호출하기 위해서입니다.
> [!CAUTION]
> [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** 섹션 **`.fini_array`**는 **읽기 전용**으로 설정됩니다.
> 최신 버전에서는 [**Partial RELRO**]가 있어도 섹션 **`.fini_array`**는 **읽기 전용**으로 설정됩니다.
{{#include ../../banners/hacktricks-training.md}}