Background: PIE
์๋ก
ASLR์ด ์ ์ฉ๋๋ฉด ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋ ๋๋ง๋ค ์คํ, ํ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ด ๋ฌด์์ ์ฃผ์์ ๋งคํ๋๋ฏ๋ก,
๊ณต๊ฒฉ์๊ฐ ์ด ์์ญ๋ค์ ๊ณต๊ฒฉ์ ํ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๋ ์ฝ์ค์ ์ค์ต addr์ ๋ ์ฌ๋ ค ๋ณด๋ฉด,
๋ค๋ฅธ ์์ญ์ ์ฃผ์๋ ๊ณ์ ๋ณํํ๋๋ฐ mainํจ์์ ์ฃผ์๋ ๋งค๋ฒ ๊ฐ์์ต๋๋ค.
Mitigation: NX & ASLR
์์คํ ๋ณด์์ ์ง๋ ์๋ ๊ฐ ๋ฐ์ ํด์จ ๊ณต๊ฒฉ ๊ธฐ๋ฒ๊ณผ ๋ณดํธ ๊ธฐ๋ฒ์ ๋ฐ์ ์์์ ๋ณด์๋ฉด.. ์ด๋ค ๋ณดํธ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ๋ฉด ์ฐํ ๊ธฐ์ ๋ ๋ฑ์ฅํฉ๋๋ค.. ์ด๋ ๊ฒ ์ด๋ค ๊ณต๊ฒฉ์ด ์ฌ์ง ๋ชจ๋ฅด๊ธฐ์ ์์คํ ๊ฐ๋ฐ์๋ค
dystopia050119.tistory.com
์ด๋ฐ ํน์ง์ ์ด์ฉํด ๊ณต๊ฒฉ์๋ ๊ณ ์ ๋ ์ฃผ์์ ์ฝ๋ ๊ฐ์ ฏ์ ํ์ฉํ ROP๋ฅผ ์ํํ ์ ์์ต๋๋ค.
Position-Independent Executable(PIE)์ ASLR์ด ์ฝ๋ ์์ญ์๋ ์ ์ฉ๋๊ฒ ํด์ฃผ๋ ๊ธฐ์ !!
์ด ๊ธฐ์ ์ ๋ณด์์ฑ ํฅ์์ ์ํด ๋์
๋ ๊ฒ์ ์๋๋ผ ์๋ฐํ ๋งํ๋ฉด ๋ณดํธ ๊ธฐ๋ฒ X
๊ทธ๋ฌ๋ ์ค์ ๋ก ASLR๊ณผ ๋ง๋ฌผ๋ ค ๊ณต๊ฒฉ์ ๋์ฑ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ์ ์ฌ๋ฌ ๊ณณ์์ ๋ณดํธ๊ธฐ๋ฒ์ผ๋ก ์๊ฐ๋ฉ๋๋ค.
์ ํฌ ๋ก๋๋งต์์ ๊ธฐ์ ๋ก ์๊ฐํ๊ฒ ์ต๋๋ค.
12345678910111213141516171819202122 // 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
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๊ฐ ์ ์ฉ๋ ๋ฐ์ด๋๋ฆฌ์ ์๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๊ตํ๊ธฐ ์ํด ๋ค์ ์์ ๋ฅผ ์ปดํ์ผํ๊ณ ,
์ด์
๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๋น๊ตํ๊ฒ ์ต๋๋ค.
12345678910111213 // 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์ ์ ๋ฌ ๋ฐฉ์๊ณผ ๋ค๋ฆ ๋๋ค.
no_pic์์๋ 0x404018๋ผ๋ ์ ๋ ์ฃผ์์์ ๋ฌธ์์ด์ ์ฐธ์กฐ๋ฐ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด์..
pic๋ ๋ฌธ์์ด์ ์ฃผ์๋ฅผ rip+0xec3(0x55..6011)์์ ์ฐธ์กฐ๋ฐ๋ ๋ชจ์ต์
๋๋ค.
๋ฐ์ด๋๋ฆฌ๊ฐ ๋งคํ๋๋ ์ฃผ์๊ฐ ๋ฐ๋๋ฉด no_pic์์๋ ํจ๊ป ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ฃผ์๋ ์ด๋ํ๋ฏ๋ก
์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋, pic๋ rip๋ฅผ ํตํ ์๋ ์ฐธ์กฐ(Relative Addressing)๋ก์จ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ๊ธฐ์ ๋ฌธ์ X
PIE(Position-Independent Executable)
๋ฌด์์ ์ฃผ์์ ๋งคํ๋์ด๋ ์คํ ๊ฐ๋ฅํ ์คํ ํ์ผ
ASLR์ด ๋์
์ , ์คํ ํ์ผ์ ๋ฌด์์ ์ฃผ์์ ๋งคํํ ํ์๊ฐ ์์๊ธฐ์ ์ด๊ธฐ ๋ฆฌ๋
์ค ์คํ ํ์ผ ํ์์
์ฌ๋ฐฐ์น๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ค๊ณ ๋ฐ ๊ตฌํ๋์์ต๋๋ค.
์ดํ ASLR์ด ๋์
ํ, ์คํ ํ์ผ๋ ๋ฌด์์ ์ฃผ์์ ๋งคํ๋๊ฒ ํ๊ธฐ ์ํด ์ด์ ์ ์๋
์คํ ํ์ผ์ ํ์๋ ๋ณ๊ฒฝํ๋ฉด ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ์
์๋ ์ฌ๋ฐฐ์น๊ฐ ๊ฐ๋ฅํ ๊ณต์ ์คํ์ ํธ๋ฅผ ์คํ ํ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
์ค์ ๋ก ๋ฆฌ๋ ์ค์ ๊ธฐ๋ณธ ์คํ ํ์ผ ์ค ํ๋์ธ /bin/sh๋ ๊ณต์ ์ค๋ธ์ ํธ ํ์์ ๋๊ณ ์์ต๋๋ค.
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๋ฅผ ์ฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๊ธฐ๋ ํจ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง