Jastes 2022. 11. 28. 15:37


์„œ๋ก 

ASLR์ด ์ ์šฉ๋˜๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์Šคํƒ, ํž™, ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์ด ๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ๋งคํ•‘๋˜๋ฏ€๋กœ,
๊ณต๊ฒฉ์ž๊ฐ€ ์ด ์˜์—ญ๋“ค์„ ๊ณต๊ฒฉ์— ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๋‚œ ์ฝ”์Šค์˜ ์‹ค์Šต addr์„ ๋– ์˜ฌ๋ ค ๋ณด๋ฉด,
๋‹ค๋ฅธ ์˜์—ญ์˜ ์ฃผ์†Œ๋Š” ๊ณ„์† ๋ณ€ํ™”ํ•˜๋Š”๋ฐ mainํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋Š” ๋งค๋ฒˆ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

 

Mitigation: NX & ASLR

์‹œ์Šคํ…œ ๋ณด์•ˆ์€ ์ง€๋‚œ ์ˆ˜๋…„๊ฐ„ ๋ฐœ์ „ํ•ด์˜จ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•๊ณผ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์˜ ๋ฐœ์ „ ์–‘์ƒ์„ ๋ณด์‹œ๋ฉด.. ์–ด๋–ค ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด ๋“ฑ์žฅํ•˜๋ฉด ์šฐํšŒ ๊ธฐ์ˆ ๋„ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.. ์ด๋ ‡๊ฒŒ ์–ด๋–ค ๊ณต๊ฒฉ์ด ์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ์— ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž๋“ค

dystopia050119.tistory.com

์ด๋Ÿฐ ํŠน์ง•์„ ์ด์šฉํ•ด ๊ณต๊ฒฉ์ž๋Š” ๊ณ ์ •๋œ ์ฃผ์†Œ์˜ ์ฝ”๋“œ ๊ฐ€์ ฏ์„ ํ™œ์šฉํ•œ ROP๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Position-Independent Executable(PIE)์€ ASLR์ด ์ฝ”๋“œ ์˜์—ญ์—๋„ ์ ์šฉ๋˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ !!
์ด ๊ธฐ์ˆ ์€ ๋ณด์•ˆ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋„์ž…๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋ณดํ˜ธ ๊ธฐ๋ฒ• X

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋ก  ASLR๊ณผ ๋งž๋ฌผ๋ ค ๊ณต๊ฒฉ์„ ๋”์šฑ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ธฐ์— ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ณดํ˜ธ๊ธฐ๋ฒ•์œผ๋กœ ์†Œ๊ฐœ๋ฉ๋‹ˆ๋‹ค.
์ €ํฌ ๋กœ๋“œ๋งต์—์„  ๊ธฐ์ˆ ๋กœ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Name: addr.c
// Compile: gcc addr.c -o addr -ldl -no-pie -fno-PIE
 
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
 
int main() {
  char buf_stack[0x10];                   // ์Šคํƒ ๋ฒ„ํผ
  char *buf_heap = (char *)malloc(0x10);  // ํž™ ๋ฒ„ํผ
 
  printf("buf_stack addr: %p\n", buf_stack);
  printf("buf_heap addr: %p\n", buf_heap);
  printf("libc_base addr: %p\n",
         *(void **)dlopen("libc.so.6", RTLD_LAZY));  // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ
 
  printf("printf addr: %p\n",
         dlsym(dlopen("libc.so.6", RTLD_LAZY),
               "printf"));  // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ
 
  printf("main addr: %p\n", main);  // ์ฝ”๋“œ ์˜์—ญ์˜ ํ•จ์ˆ˜ ์ฃผ์†Œ
}
cs

PIE๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ addr์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ


PIC์™€ PIE

๋ฆฌ๋ˆ…์Šค์—์„œ ELF๋Š” ์‹คํ–‰ํŒŒ์ผ(Executable)๊ณผ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ(Shared object; SO)๋กœ ๋‘๊ฐ€์ง€๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์‹คํ–‰ํŒŒ์ผ์€ ./addr๊ณผ ๊ฐ™์œผ๋ฉฐ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์€ libc.so๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌ๋ฐฐ์น˜(Relocation)๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์žฌ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋Š ์ฃผ์†Œ์— ์ ์žฌ๋˜์–ด๋„ ์ฝ”๋“œ์˜ ์˜๋ฏธ๊ฐ€ ํ›ผ์† X๋ฅผ ์˜๋ฏธ

CS์—์„  ์ด๋Ÿฐ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ Position-Independent Code(PIC)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

addr๊ณผ libc-2.27.so์˜ ํŒŒ์ผ ํ˜•์‹

gcc๋Š” PIC ์ปดํŒŒ์ผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

PIC๊ฐ€ ์ ์šฉ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์•„๋‹Œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ ,
์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
// Name: pic.c
// Compile: gcc -o pic pic.c
//            : gcc -o no_pic pic.c -fno-pic -no-pie
 
#include <stdio.h>
 
char *data = "Hello World!";
 
int main() {
  printf("%s", data);
  return 0;
}
 
cs

PIC ์ฝ”๋“œ ๋ถ„์„

no_pic์™€ pic์˜ mainํ•จ์ˆ˜๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด, main+14์—์„œ "%p" ๋ฌธ์ž์—ด์„ printf์— ์ „๋‹ฌ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

left : no_pic & right : pic

no_pic์—์„œ๋Š” 0x404018๋ผ๋Š” ์ ˆ๋Œ€ ์ฃผ์†Œ์—์„œ ๋ฌธ์ž์—ด์„ ์ฐธ์กฐ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—..
pic๋Š” ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋ฅผ rip+0xec3(0x55..6011)์—์„œ ์ฐธ์กฐ๋ฐ›๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋งคํ•‘๋˜๋Š” ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด no_pic์—์„œ๋Š” ํ•จ๊ป˜ ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ฃผ์†Œ๋„ ์ด๋™ํ•˜๋ฏ€๋กœ
์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‚˜, pic๋Š” rip๋ฅผ ํ†ตํ•œ ์ƒ๋Œ€ ์ฐธ์กฐ(Relative Addressing)๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต๋ฐ›๊ธฐ์— ๋ฌธ์ œ X


PIE(Position-Independent Executable)

๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ๋งคํ•‘๋˜์–ด๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ํŒŒ์ผ

ASLR์ด ๋„์ž… ์ „, ์‹คํ–‰ ํŒŒ์ผ์„ ๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ๋งคํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๊ธฐ์— ์ดˆ๊ธฐ ๋ฆฌ๋ˆ…์Šค ์‹คํ–‰ ํŒŒ์ผ ํ˜•์‹์€
์žฌ๋ฐฐ์น˜๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ ASLR์ด ๋„์ž… ํ›„, ์‹คํ–‰ ํŒŒ์ผ๋„ ๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ๋งคํ•‘๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ์žˆ๋Š”
์‹คํ–‰ ํŒŒ์ผ์˜ ํ˜•์‹๋„ ๋ณ€๊ฒฝํ•˜๋ฉด ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ์—
์›๋ž˜ ์žฌ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ์˜คํ”„์ ํŠธ๋ฅผ ์‹คํ–‰ ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ฆฌ๋ˆ…์Šค์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜์ธ /bin/sh๋Š” ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ ํ˜•์‹์„ ๋„๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

dynamically๊ฐ€ shared object๋ž๋‹ˆ๋‹ค.


 PIE on ASLR

PIE๋Š” ์žฌ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ASLR์ด ์ ์šฉ๋œ ์‹œ์Šคํ…œ์—์„  ์‹คํ–‰ ํŒŒ์ผ๋„ ๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ์ ์žฌ๋ฉ๋‹ˆ๋‹ค.
์œ„์— add.c ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒˆ์—” PIE๋ฅผ ์ ์šฉํ•œ ์ปดํŒŒ์ผ์„ ํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค!

์ฐธ๊ณ ๋กœ ํ˜„๋Œ€์˜ gcc๋Š” PIE๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉํ•˜๋ฏ€๋กœ ์ด์ „์— ๊ฑธ์—ˆ๋˜ ๋ชจ๋“ ์˜ต์…˜์„ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด..
PIE๊ฐ€ ์ ์šฉ๋˜๋ฉฐ, ์‹คํ–‰ํ•˜๋ฉด mainํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ ๋งค ์‹คํ–‰๋งˆ๋‹ค ๋ฐ”๋€Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค


PIE ์šฐํšŒ

code base found

ASLR ํ™˜๊ฒฝ์—์„œ PIE๊ฐ€ ์ ์šฉ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฃผ์†Œ์— ์ ์žฌ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์˜์—ญ์˜ ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ ‘๊ทผํ• ๋ ค๋ฉด
๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ ์žฌ๋œ ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์†Œ๋ฅผ PIE ๋ฒ ์ด์Šค, ๋˜๋Š” ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๊ตฌํ• ๋ ค๋ฉด libc์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ๊ตฌํ•  ๋•Œ์ฒ˜๋Ÿผ
์ฝ”๋“œ ์˜์—ญ์˜ ์ž„์˜ ์ฃผ์†Œ๋ฅผ ์ฝ๊ณ , ๊ทธ ์ฃผ์†Œ์—์„œ ์˜คํ”„์…‹์„ ๋นผ์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์€ ์•„๋ž˜ ๋งํฌ์—์„œ ์‰ฝ๊ฒŒ ๋‹ค์‹œ ์‹ค์Šตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ค๋ช…์€ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Exploit Tech: Return Oriented Programming

Return Oriented Programming ROP : ๋ฆฌํ„ด ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์‹คํ–‰ ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ• ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ ์ƒํ™ฉ์— ๋งž์ถฐ RTL/Return to dl-resolve/GOT overwrite ๋“ฑ์„ ์ด์šฉํ•ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค!

dystopia050119.tistory.com


Partial Overwrite

 ๋ฐ˜ํ™˜ ์ฃผ์†Œ์˜ ์ผ๋ถ€ ๋ฐ”์ดํŠธ๋งŒ ๋ฎ๋Š” ๊ณต๊ฒฉ

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋Š” ํ˜ธ์ถœ ํ•จ์ˆ˜(Caller)์˜ ๋‚ด๋ถ€๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
ํŠน์ • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๊ด€๊ณ„๋Š” ์ •์  ๋ถ„์„ ๋˜๋Š” ๋™์  ๋ถ„์„์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๋ฉฐ,
์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ASLR์˜ ํŠน์„ฑ ์ƒ, ์ฝ”๋“œ ์˜์—ญ์˜ ์ฃผ์†Œ๋„ ํ•˜์œ„ 12๋น„ํŠธ ๊ฐ’์€ ํ•ญ์ƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๊ฐ€์ ฏ์˜ ์ฃผ์†Œ๊ฐ€ ret์™€ ํ•˜์œ„ ํ•œ ๋ฐ”์ดํŠธ๋งŒ ๋‹ค๋ฅด๋ฉด, ์ด ๊ฐ’๋งŒ ๋ฎ์–ด ์กฐ์ž‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ๋‘ ๋ฐ”์ดํŠธ ์ด์ƒ์ด ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธฐ๊ณ ์ž ํ•˜๋ฉด brute force์ด ์š”๊ตฌ๋˜์ฃ 


๋งˆ๋ฌด๋ฆฌ

PIE๋Š” ์ž์ฒด์ ์ธ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ASLR๊ณผ ๋งž๋ฌผ๋ ค ์‹œ์Šคํ…œ์„ ํ•œ ์ธต ๋” ์•ˆ์ „ํ•œ ๋ณดํ˜ธ ํšจ๊ณผ๋กœ์จ,
์ด๋ฅผ ์šฐํšŒํ•˜๋ ค๋ฉด ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ตฌํ•˜๊ฑฐ๋‚˜ Partial Overwrite์˜ ๋ฐฉ์‹์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ๋Œ€ ์ฐธ์กฐ(Relative Addressing)
    : ์–ด๋–ค ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹
  • Position Independent Code(PIC)
    : ์–ด๋–ค ์ฃผ์†Œ์— ๋งคํ•‘๋˜์–ด๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ
    - ์ ˆ๋Œ€ ์ฃผ์†Œ ์‚ฌ์šฉ X
    - ์ผ๋ฐ˜์ ์œผ๋ก  rip๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•จ
  • Partial Overwrite
    : ์–ด๋–ค ๊ฐ’์„ ์ผ๋ถ€๋ถ„๋งŒ ๋ฎ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•
    - PIE๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•จ

์ฐธ๊ณ  ์ž๋ฃŒ

 

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