RELRO(RELocation Read-Only)
๋ฑ์ฅ๋ฐฐ๊ฒฝ
- ELF๋ GOT๋ฅผ ํ์ฉํด ๋ฐ๋ณต๋๋ lib์ ํจ์์ ํธ์ถ ๋น์ฉ ↓
- GOT์ ๊ฐ์ ์ฑ์ฐ๋ ๋ฐฉ์์ ์ฌ๋ฌ๊ฐ์ง ๊ทธ์ค์ ์ฐ๋ฆฐ Lazy Binding์ผ๋ก ์ทจ์ฝ์ ์ฐํ
: ํจ์๊ฐ ์ฒ์ ํธ์ถ๋ ๋ ํจ์์ ์ฃผ์๋ฅผ ๊ตฌํ๊ณ , ์ด๋ฅผ GOT์ ๋ ๋ฐฉ์
- Lazy binding ํ๋ ๋ฐ์ด๋๋ฆฌ๋ ์คํ ์ค ๊ณ์ ์ ๋ฐ์ดํธ๋ฅผ ํด์ผํด GOT์ ์ฐ๊ธฐ โ
: RTL, Chain RTL, ROP๋ก ์ด์ด์ง
๋ํ ELF์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์๋ ํ๋ก์ธ์ค์ ์ด๊ธฐํ ๋ฐ ์ข
๋ฃ์ ๊ด๋ จ๋
.init_array .fini_array ๋ก์จ, ์ด ์์ญ๋ค์ ํ๋ก์ธ์ค์ ์์๊ณผ ์ข
๋ฃ์ ์คํํ ํจ์๋ค์ ์ฃผ์ ์ ์ฅ
์ฌ๊ธฐ์ ๊ณต๊ฒฉ์๊ฐ ์์๋ก ๊ฐ์ ์ธ ์ ์๋ค๋ฉด, ํ๋ก์ธ์ค์ ์คํ ํ๋ฆ์ด ์กฐ์๋ ์ ์์ต๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์, ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ณดํธํ๋ RELRO์ ๊ฐ๋ฐํ์์ต๋๋ค.
RELRO๋ ์ฐ๊ธฐ ๊ถํ์ด ๋ถํ์ํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ฐ๊ธฐ ๊ถํ์ ์ ๊ฑฐํฉ๋๋ค(์๋ฌธ ๊ทธ๋๋ก์ฃ )
RELRO๋ ์ ์ฉ ๋ฒ์์ ๋ฐ๋ผ 3๊ฐ์ง๋ก ๊ตฌ๋ณ๋ฉ๋๋ค.
No RELRO
- ELF ๊ธฐ๋ณธํค๋, ์ฝ๋์์ญ๋ฅผ ์ ์ธํ ๊ฑฐ์ ๋ชจ๋ ๋ถ๋ถ์ RW ๊ถํ ๋ถ์ฌ
Ex) ์ด์ ๊น์ง์ ํ๋๋ค์์ ๋ค No RELRO๋ก ๊ฑธ๋ ค์๋ ๋ชจ์ต์ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
$ gcc -o ./code ./code.c -z norelro
Partial RELRO
- No RELRO์ ๋งค์ฐ ๋น์ทํ๋ _DYNAMIC ์น์ ์ ์ฐ๊ธฐ ๊ถํ X
$ gcc -o ./partial_relro partial_relro.c -W -z relro
full relro
- bss ์์ญ์ ์ ์ธํ ๋ชจ๋ ๋ถ๋ถ์์ write ๊ถํ์ ์์ด์ง
$ gcc -o ./full_relro full_relro.c -W -z relro -z now
Partial RELRO
Full๊ณผ Partial์ ์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ฐํด ์๋์ ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
์์ ๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ๋งต์ ์ถ๋ ฅํ๋ ๋ฐ์ด๋๋ฆฌ์ ์์ค ์ฝ๋์
๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ -fno-PIE์ ๋ช ๋ น์ด๊ฐ ์ ๋จน์ด์ ๋์ฒด๋ก -z relro๋ก ํ์์ต๋๋ค.
12345678910111213141516171819 // Name: relro.c// Compile: gcc -o prelro relro.c -no-pie -fno-PIE#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main() {FILE *fp;char ch;fp = fopen("/proc/self/maps", "r");while (1) {ch = fgetc(fp);if (ch == EOF) break;putchar(ch);} return 0;}cs
Full๋ก ํ๊ณ ์ถ์ผ๋ฉด ๋ณดํธ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ ํด๋ ๋๊ณ์ฃ
์ ๋ Kali๋ผ์ ์๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ๋ ์๋๋ฐ.. ์ํฉ์ ๋ง์ถ์ด ์ปดํ์ผ ํด์ค์๋ค.
Partial RELRO ๊ถํ
์คํํ๋ฉด, 0x601000๋ถํฐ ...20000๊น์ง์ ์ฃผ์์๋ ์ฐ๊ธฐ ๊ถํ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
.init_array์ .fini_array๋ ๊ฐ๊ฐ 0x600e10๊ณผ 0x600e18์ ํ ๋น๋์ด ์ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅ
๊ทธ๋ฌ๋ ์๋ ๋ถ๋ถ์ ์ฐธ์กฐํด๋ณด๋ฉด ํด๋น ์์ญ์๋ .got.plt, .data, .bss๊ฐ ํ ๋น๋์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ์น์
๋ค์๋ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.(ํด๋น wirte์ ๊ถํ์ด ์๋ ์ฃผ์์ ์๊ธฐ์)
๐ก.got์ got.plt
- Partial PELRO๊ฐ ์ ์ฉ๋ ๋ฐ์ด๋๋ฆฌ๋ got์ ๊ด๋ จ ์น์ ์ด .got์ .got.plt๋ก ๋ ๊ฐ๊ฐ ์กด์ฌ
- ์ ์ญ ๋ณ์ ์ค์์ ์คํ๋๋ ์์ ์ ๋ฐ์ธ๋ฉ(now binding)๋๋ ๋ณ์๋ .got์ ์์นํจ
: ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋ ๋๋ ์ด๋ฏธ ๋ฐ์ธ๋ฉ์ด ์๋ฃ๋์ด์์ผ๋ฏ๋ก ์ด ์์ญ์ ์ฐ๊ธฐ ๊ถํ X
- ์คํ ์ค์ ๋ฐ์ธ๋ฉ(lazy binding)๋๋ ๋ณ์๋ .got.pit์ ์์นํจ
- ์คํ ์ค์ ๊ฐ์ด ์จ์ ธ์ผ ํ๋ฏ๋ก ์ฐ๊ธฐ ๊ถํ์ด ๋ถ์ฌ๋จ
: Partial RELRO๊ฐ ์ ์ฉ๋ ๋ฐ์ด๋๋ฆฌ์์ ๋๋ถ๋ถ ํจ์๋ค์ GOT ์ํธ๋ฆฌ ์์ ๊ฐ์ด ์ ์ฅ
โป์ดํดํ๋ฉด ์ข์ ์ฉ์ด
๋ฐ์ธ๋ฉ(Binding)
- ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋ ๊ตฌ์ฑ ์์์ ์ค์ ๊ฐ ๋๋ ํ๋กํผํฐ๋ฅผ ๊ฒฐ์ ์ง๋ ํ์๋ฅผ ์๋ฏธ
- ํจ์๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์์ ์ค์ ํจ์๊ฐ ์์นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ๋ ๋ฐ๋ก ๋ฐ์ธ๋ฉ
GOT(Global Offset Table)
- GOT ์ํธ๋ฆฌ ์ฃผ์๋ผ๊ณ ๋ ์ง์นญ๋จ
- ELF(๊ตฌํ์ ์ํ lib ๋ชจ์) ํ์ผ์ ๊ณ ์ ๋ ์์น์ ์์
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ์คํ ํ๋ก์ธ์ค ์ด๋ฏธ์ง๋ค์๊ฒ ๊ณตํต์ ์ธ ์ฃผ์์ ์๊ฒ ๋จ
Full RELRO
์ด๋ฒ์ ์ ๊ฑฐํ๊ณ ๋ฃ์ด๋ด ์๋ค
์คํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋งต์ ํ์ธ ์ด๋ฅผ ์น์
ํค๋ ์ ๋ณด์ ์ข
ํฉํ๋ฉด..
got์๋ ์ฐ๊ธฐ ๊ถํ์ด ์ ๊ฑฐ๋๋ฉฐ, data์ bss์๋ง ์ฐ๊ธฐ ๊ถํ์ด ์์ต๋๋ค.
Full RELRO๊ฐ ์ ์ฉ๋๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ค์ ์ฃผ์๊ฐ ๋ฐ์ด๋๋ฆฌ์ ๋ก๋ฉ ์์ ์ผ๋ก ๋ชจ๋ ๋ฐ์ธ๋ฉ
๋ฐ๋ผ์ GOT์๋ ์ฐ๊ธฐ ๊ถํ์ด ๋ถ์ฌ X
RELRO ๊ธฐ๋ฒ ์ฐํ
Partial PELRO, Full RELRO์ ์ ์ฉ ๋ฐฉ์๊ณผ ํจ๊ณผ๋ฅผ ํ์ธํด ๋ดค์ต๋๋ค.
Partial RELRO์ ๊ฒฝ์ฐ๋ .init_array์ .fini_array ๋ํ ์ฐ๊ธฐ๊ถํ์ด ์ ๊ฑฐ๋ก ๋ ์์ญ์ ๋ฎ๋๊ฑด ํ๋ฌ
ํ์ง๋ง, .got.plt ์์ญ์ ๋ํ ์ฐ๊ธฐ ๊ถํ์ด ์กด์ฌํ๋ฏ๋ก GOT overwrite ๊ณต๊ฒฉ์ ํ์ฉ
Full RELRO์ ๊ฒฝ์ฐ, .init_array .fini_array ๋ฟ๋ง ์๋๋ผ .got ์์ญ์๋ ์ฐ๊ธฐ ๊ถํ์ด ์ ๊ฑฐ๋์์ต๋๋ค.
๊ทธ๋์ ๊ณต๊ฒฉ์๋ค์ ๋ฎ์ด์ธ ์ ์๋ ๋ค๋ฅธ ํจ์ ํฌ์ธํฐ๋ฅผ ์ฐพ๋ค๊ฐ lib์ ์์นํ hook๋ฅผ ์ฐพ์๋์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ํ์ ์ธ hook์ด malloc hook๊ณผ free hook์
๋๋ค.
์๋ ์ด ํจ์ ํฌ์ธํฐ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๊ณผ ํด์ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฒ๊ทธ๋ฅผ ๋๋ฒ๊น
ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ฌ
๊ทธ๋ฌ๋ ํ์ฌ ์ฐ๋ฆฌ์๊ฒ๋ hook์ ์ด์ฉํ์ฌ hooking ํ์ฌ exploit์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
malloc ํจ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ํจ์ ์์ ๋ถ๋ถ์์ __malloc_hook์ด ์กด์ฌ ์ฌ๋ถ ๊ฒ์ฌ ๋ฐ ํธ์ถ
__malloc_hook์ libc.so์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์์ญ์ ์์นํฉ๋๋ค.
๋ฐ๋ผ์ ๊ณต๊ฒฉ์๋ libc๊ฐ ๋งคํ๋ ์ฃผ์๋ฅผ ์ ๋, ์ด ๋ณ์๋ฅผ ์กฐ์ํด malloc์ ํธ์ถ, ์คํ ํ๋ฆ ์กฐ์ ๊ฐ๋ฅ!
์ด์ ๊ฐ์ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ํตํ์ด Hook Overwrite๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋ง๋ฌด๋ฆฌ
Hook : ํจ์ ํธ์ถ, ์ด๋ฒคํธ ๋๋ ๋ฉ์์ง ๋ฑ์ ์ฒ๋ฆฌํ๋ ์ฝ๋
Hooking : OS๋ SW ๋ฑ ๊ฐ์ข
ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ ์์ ๊ฐ์ ๋ฐ์ํ๋ Hook ๋ณ์กฐ
- RELocation Read-Only(RELRO)
: ๋ถํ์ํ ๋ฐ์ดํฐ ์์ญ์ ์ฐ๊ธฐ ๊ถํ ์ ๊ฑฐ - Partial RELRO
: init array, fini array ๋ฑ ์ฌ๋ฌ ์น์ ์ ์ฐ๊ธฐ ๊ถํ ์ ๊ฑฐ
- _DYNAMIC ์น์ ์ ์ฐ๊ธฐ ๊ถํ X
- Lazy binding์ ์ฌ์ฉํ๋ฏ๋ก libc func๋ค์ GOT EP(Entry Pointer)๋ ์ฐ๊ธฐ ๊ฐ๋ฅ
- GOT Overwrite ๋ฑ์ ๊ณต๊ฒฉ์ผ๋ก ์ฐํ ๊ฐ๋ฅ - Full RELRO
: Partial RELRO ๋ฟ๋ง ์๋ GOT์ ์ฐ๊ธฐ ๊ถํ ์ ๊ฑฐ
- now binding์ ์ฌ์ฉํ์ฌ libc func๋ค์ ์ฃผ์๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ๋ก๋๋๋ ์์ ์ ๋ฐ์ธ๋ฉ๋จ
- libc์ malloc hook, free hook๊ณผ ๊ฐ์ ํจ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ๋ ๊ณต๊ฒฉ์ผ๋ก ์ฐํ ๊ฐ๋ฅ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
uaf_overwr (0) | 2022.11.06 |
---|---|
Tcache Poisoning (0) | 2022.11.06 |
basic_exploitation_003 (0) | 2022.10.30 |
hook (0) | 2022.10.30 |
fho (0) | 2022.10.30 |