Jastes 2022. 10. 31. 09:19


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๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ณต๊ฒฉ์œผ๋กœ ์šฐํšŒ ๊ฐ€๋Šฅ
  •  

์ฐธ๊ณ  ์ž๋ฃŒ

 

Background: RELRO

RELRO ๋ณดํ˜ธ ๊ธฐ๋ฒ•๊ณผ ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€