์คํ ์นด๋๋ฆฌ(Stack Canary)
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก๋ถํฐ ๋ฐํ ์ฃผ์๋ฅผ ๋ณดํธํ๋ ๊ธฐ๋ฒ
ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ ์์์ ๊ฐ์ ์ฝ์
ํ๊ณ , ํจ์์ ์ํ๋ก๊ทธ์์
ํด๋น ๊ฐ์ ๋ณ์กฐ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ์
๋๋ค. ์นด๋๋ฆฌ ๊ฐ์ ๋ณ์กฐ๊ฐ ํ์ธ๋๋ฉด ํ๋ก์ธ์ค ๊ฐ์ ์ข
๋ฃ!
BOF๋ก RET๋ฅผ ๋ฎ์ผ๋ ค๋ฉด ๋ฐ๋์ ์นด๋๋ฆฌ๋ฅผ ๋จผ์ ๋ฎ์ด์ผํ๋ฏ๋ก ์นด๋๋ฆฌ ๊ฐ์ ๋ชจ๋ฅด๋ ๊ณต๊ฒฉ์๋
๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ ๋ ์นด๋๋ฆฌ ๊ฐ์ ๋ณ์กฐํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌํ๋ค๋ฉด ๋ณ์กฐ๊ฐ ํ์ธ๋์ด
๊ณต๊ฒฉ์๋ ์คํ ํ๋ฆ์ ํ๋ํ์ง ๋ชปํ๊ฒ๋ฉ๋๋ค.
TMI. ์นด๋๋ฆฌ๋ผ๋ ์ด๋ฆ์ ์ ๋
์นด๋๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ์ ์ด๋ฆ์ ์นด๋๋ฆฌ์(Canary)๋ผ๋ ์์์ ์ ๋๋์์ต๋๋ค. 19์ธ๊ธฐ, 20์ธ๊ธฐ์๋ ์ผ์ฐํํ์ ๋๋์ ์ธก์ ๊ธฐ์ ์ด ๋ถ์กฑํ๊ณ , ํ๊ด์์ ์ ์ถ๋ ์ผ์ฐํํ์์ ๊ด๋ถ๊ฐ ์ค๋ ์ฌํ๋ ์ฌ๊ฑด์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ์์ต๋๋ค. ๊ทธ๋์ ๊ด๋ถ๋ค์ ์ฌ๋๋ณด๋ค ์ผ์ฐํํ์์ ๋๋์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ๋ ์นด๋๋ฆฌ์์ ํจ๊ป ํ๊ด์ ๋ค์ด๊ฐ์ต๋๋ค. ์นด๋๋ฆฌ์๊ฐ ์ผ์ฐํํ์์ ๋ฐ์ํ๊ธฐ ์์ํ๋ฉด ๊ด๋ถ๋ค์ ์ผ์ฐํํ์์ ๋๋๊ฐ ์ํ ์์ค์ ๋ค๋ค๋๋ค๊ณ ํ๋จํ๊ณ ๋ํผํ ์ ์์์ต๋๋ค.
์ด๋ฐ ์ญ์ฌ์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ธํด ์นด๋๋ฆฌ์๋ “์ํ์ ์๋ ค์ฃผ๋ ์”๋ผ๋ ์์ง์ ์๋ฏธ๋ฅผ ๊ฐ๊ฒ ๋์์ต๋๋ค. ์ํํธ์จ์ด๋ฅผ ์ถ์ํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ ๋, ๋ฒ ํ ํ ์คํธ ์ฉ๋๋ก ๊ณต๊ฐํ๋ ๋ฒ์ ์ ์นด๋๋ฆฌ ๋ฒ์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ๋ ์ด๋ฐ ์๋ฏธ๊ฐ ๋ฐ์๋ ๊ฒ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์นด๋๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ๋ ๋ฐํ ์ฃผ์๊ฐ ๋ฎ์ธ ๊ฒ์ ์๋ ค์ค๋ค๋ ์๋ฏธ์์ “์นด๋๋ฆฌ”๋ก ์ด๋ฆ ๋ถ์ฌ์ก์ต๋๋ค
์นด๋๋ฆฌ ์๋ ์๋ฆฌ
// Name: canary.c
#include <unistd.h>
int main() {
char buf[8];
read(0, buf, 32);
return 0;
}
์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ๋ณดํธ ๊ธฐ๋ฒ์ ์ ์ฉ์ ๋ํ ์ฐจ์ด์ ๊ณผ ํน์ง์ ์์๋ด ์๋ค!
์นด๋๋ฆฌ ๋นํ์ฑํ
์ค์ต ํ๊ฒฝ์ธ Ubuntu 18.04์ gcc๋ ์๋์ผ๋ก ์คํ ์นด๋๋ฆฌ๋ฅผ ์ ์ฉํ๊ธฐ์ ์ปดํ์ผ ์ต์
์ผ๋ก
-fno-stack-protector ์ต์
์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ฝ๊ฒ ์์ํ๋ ๊ฑฐ์ฒ๋ผ core file์ด ์์ฑ๋ ๋ชจ์ต์ด์ฃ
์ฐธ๊ณ ๋ก ํ๊ฒฝ๋ง๋ค ๊ฒฝ๊ณ ๋ฌธ ๋ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ -w ์ฌ์ฉํ์๋ฉด ๋ฌด์ํ ์ ์์ด์
์ ๊ทธ๋ผ segmentation fault๋ฅผ ๋์ ์ผ๋๊น ๋ถ์์ ์ข ์๋ค๊ฐ ํ๊ณ ๋ค์์ผ๋ก๋..
์นด๋๋ฆฌ ํ์ฑํ
๋ณด์๋ฉด.. Segmentation fault๊ฐ ์๋๋ผ
stack smashing detected์ Aborted๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํด์ผ ํ๋๋ฐ..
์นผ๋ฆฌ๋ฆฌ๋
์ค๋ผ์.. ๊ทธ๋ฐ๊ฐ์? ๊ณต๋ถ๋ฅผ ํ ์๋ก ์๋ฌธ๋ง ๋์ด๊ฐ๋๊ฒ.. ํ๋๋ค์ใ
์จ๋ ์ ์๋ฌ๋ค์ ๋ถ์ํ๋ฉด Stack BOF๊ฐ ํ์ง๋์ด ํ๋ก์ธ์ค ๊ฐ์ ์ข
๋ฃ!๋ผ๋ ์ด์ผ๊ธฐ
์ ์ฉ๋ ๋ชจ์ต๊ฐ ์๋ ๋ชจ์ต์ ์ฐจ์ด๊ฐ ์ด๋ ๊ฒ ๋ช
ํํ๊ฒ ๋ณด์
๋๋ค
์.. ๊ทธ๋ผ ์ถ๊ฐ๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณผ๊น์
์.. ๊ทผ๋ฐ ์ฐธ๊ณ ๋ก kali๋ canary๊ฐ ์ ์ฉ์ด ์๋๋๋ผ๊ณ ์..
๊ทธ๋์ ์ ๋ช
๋ น์ด๋ฅผ ์ณ์ ๋ณดํธ ๊ธฐ๋ฒ์ ์ ์ฉํ์์ต๋๋ค.
gcc -fstack-protector canary.c
์นด๋๋ฆฌ ๋์ ๋ถ์
์นด๋๋ฆฌ ์ ์ฅ(canary๋ณดํธ๊ธฐ๋ฒ ์ ์ฉ)
์ถ๊ฐ๋ ํ๋กค๋ก๊ทธ์ ์ฝ๋์ ์ค๋จ์ ์ ์ค์ ํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํ
์ค๋จ์ (main+8)์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ rax์ ์ ์ฅ
fs๋ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ์ ์ผ์ข
์ผ๋ก, ๋ฆฌ๋
์ค๋ ํ๋ก์ธ์ค๊ฐ ์์๋ ๋ fs:0x28์ ๋๋ค ๊ฐ์ผ๋ก ์ ์ฅ
๋ฐ๋ผ์ ์ค๋จ์ (main+8)์ ๊ฒฐ๊ณผ๋ก rax์๋ ๋ฆฌ๋
์ค๊ฐ ์์ฑํ ๋๋ค ๊ฐ์ด ์ ์ฅ๋จ!!
๊ทผ๋ฐ ์ด ํ๊ฒฝ์์ ์ปค์คํ
๋ง์ด์ง์ด ์ ์๋ผ์.. ๋ค์ ์นผ๋ฆฌ๋ก
์ฝ๋ ์คํ ์ rax์ ๋ค์๊ณผ ๊ฐ์ด ์ฒซ ๋ฐ์ดํธ๊ฐ null์ธ 8byte ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋จ
์์ฑ๋ ๋๋ค ๊ฐ์ main+17์์ reb-0x8์ ์ ์ฅ๋จ
๐จfs๋?
์ด์ ์ ๋ฆฌ ์๋ฃ์์ CPU์๋ ๋ค์ํ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ฅผ ์์๋ดค์ต๋๋ค.
์ด๊ธฐ์ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ก code, data, extra(cs/ds/es)๊ฐ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ CPU๊ฐ๋ฐ์๋ค์ ์ฌ๊ธฐ์ ๋ ๊ฐ ๋ ์ถ๊ฐํ๊ณ ์ถ์ด์ ์ด๋ฆ ๊ณ ๋ฏผํ๋ค ์ํ๋ฒณ ์์๋๋ก..
์ด์ cs, ds, es๋ CPU๊ฐ ์ฌ์ฉ ๋ชฉ์ ์ ๋ช ์ํ ๋ ์ง์คํฐ์ธ ๋ฐ๋ฉด, fs์ gs๋ ๋ชฉ์ ์ง์ X
์ฆ, OS๊ฐ ์์๋๋ก ์ฌ์ฉํ ์ ์๋ ๋ ์ง์คํฐ์ ๋๋ค. ๋ฆฌ๋ ์ค๋ fs๋ฅผ TLS๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ!
Thread Local Storage(TLS)๋ ์นด๋๋ฆฌ ๋น๋กฏํ ํ๋ก์ธ์ค ์คํ์ ํ์ํ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ์ฅ
์ฆ, ์ค๋ ๋๋ณ ์ ์ฅ๊ณต๊ฐ..
์นด๋๋ฆฌ ๊ฒ์ฌ
์ด์ ์ถ๊ฐ๋ ์ํ๋ก๊ทธ์ ์ฝ๋์ ์ค๋จ์ ์ ์ค์ ํ๊ณ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ณ์ ์คํ์ํต๋๋ค.
์ฌ๊ธฐ์๋ 16๊ฐ์ H๋ฅผ ์ ๋ ฅ์ผ๋ก ์นด๋๋ฆฌ๋ฅผ ๋ณ์กฐํ๊ณ , ์คํ ํ๋ฆ์ด ์ด๋ป๊ฒ ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
main+50์ rbp-8์ ์ ์ฅํ ์นด๋๋ฆฌ๋ฅผ rcx๋ก ์ฎ๊น๋๋ค.
๊ทธ ๋ค, main+54์์ rcx๋ฅผ fs:0x28์ ์ ์ฅ๋ ์นด๋๋ฆฌ์ xor๋ ๊ฐ์ด ๋์ผํ๋ฉด ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด ๋๋ฉด์
je์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ฒ ๋๊ณ , mainํจ์๋ ์ ์์ ์ผ๋ก ๋ฐํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ ๊ฐ์ด ๋์ผํ์ง ์์ผ๋ฉด __stack_chk_fail์ด ํธ์ถ๋๋ฉด์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ๋ก ์ข
๋ฃ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ํ ์ค ์คํ์ํค๋ฉด, rbp-0x8์ ์ ์ฅ๋ ์นด๋๋ฆฌ ๊ฐ์ด ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ์ธํด
“0x4848484848484848”์ด ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทผ๋ฐ ์ ์ ๋ ๊ฒ ์ ๋์์.. ๋์ฒด ์ด๋ฏธ์ง๋ก ๋ฃ์๊ฒ์ ์์ ์ ๊ท์ฐฎ์์ ใ
๋ฐ์ ์ด๋ฏธ์ง๋ ๋น์ทํ ์ด์ ๋ก ๋์ฒด ์ด๋ฏธ์ง๋ก.. ใ
main+54์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ฏ๋ก main+63์์ main+70์ผ๋ก ๋ถ๊ธฐํ์ง ์๊ณ
main+65์ __stack_chk_fail์ ์คํํ๊ฒ ๋ฉ๋๋ค.
์ด ํจ์๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์นด๋๋ฆฌ ์์ฑ ๊ณผ์ ๐ฌ
์นด๋๋ฆฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์๋ ๋, TLS์ ์ ์ญ ๋ณ์๋ก ์ ์ฅ๋๊ณ , ๊ฐ ํจ์๋ง๋ค
ํ๋กค๋ก๊ทธ์ ์ํ๋ก๊ทธ์์ ์ด ๊ฐ์ ์ฐธ์กฐํ๋ฉฐ, ์ข ๊น์ด ๋ค์ด๊ฐ TLS์ ์นด๋๋ฆฌ ๊ฐ ์ ์ฅ์ ์์๋ณด์ฃ
- ํ๋กค๋ก๊ทธ : ํจ์๊ฐ ํธ์ถ ์, ์คํ ํ๋ ์์ ์ค์ ํ๋ ๊ณผ์
- ์ํ๋ก๊ทธ : ์คํ ํ๋ ์์ ์๋ฉธ์ํค๋ ๊ณผ์ , leave ๋ช ๋ น์ด์ ret ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํจ
TLS ์ฃผ์ ํ์
fs๋ TLS๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก fs์ ๊ฐ์ ์๋ฉด TLS์ ์ฃผ์๋ฅผ ์ ์ ์์
๊ทธ๋ฌ๋ ๋ฆฌ๋
์ค์์ fs์ ๊ฐ์ ํน์ ์์คํ
์ฝ์ ์ฌ์ฉํด์ผ ํ ์กฐํ๋ ์ค์ ์ด ๊ฐ๋ฅํ์ฃ
gdb์์ ๋ค๋ฅธ ๋ ์ง์คํฐ์ ๊ฐ์ ์ถ๋ ฅํ๋ฏ info register fs๋ print $fs์ ๊ฐ์ ๋ฐฉ์์ ์๋จ!
๊ทธ๋์ ์ฌ๊ธฐ์ fs์ ๊ฐ์ ์ค์ ํ ๋ ํธ์ถ๋๋ arch_prctl(int code, unsigned long addr)
์์คํ
์ฝ์ ์ค๋จ์ ์ ์ค์ ํ์ฌ fs๊ฐ ์ด๋ค ๊ฐ์ ์ค์ ๋๋์ง ์กฐ์ฌํฉ์๋ค.
์ด ์์คํ
์ฝ์ arch_prctl(ARCH_SET_FS, addr)์ ํํ๋ก ํธ์ถํ๋ฉด fs์ ๊ฐ์ addr๋ก ์ค์ ๋จ!
์ฐธ๊ณ ๋ก arch_prctl์ ๋ํ์ฌ ์์ธํ ์๊ณ ์ถ์ผ๋ฉด ์ฌ๊ธฐ๋ก
catch : gdb์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์, ํ๋ก์ธ์ค๋ฅผ ์ค์ง์ํค๋ ๋ช ๋ น์ด
์ด ๋ช ๋ น์ด๋ก arch_prctl์ catchpoint๋ฅผ ์ค์ ํ๊ณ ์ค์ต์ ์ฌ์ฉํ๋ canary๋ฅผ ์คํํฉ์๋ค
catchpoint์ ๋๋ฌํ์ ๋, rdi์ ๊ฐ์ด 0x1002์ธ๋ฐ ์ด ๊ฐ์ ARCH_SET_FS์ ์์ซ๊ฐ์ด์ฃ
rsi์ ๊ฐ์ด 0x7ffff7fb1580์ด๋ฏ๋ก, ์ด ํ๋ก์ธ์ค๋ TLS 0x7ffff7fb1580์ ์ ์ฅ → fs์ ๊ฐ๋ฆฌํด
์นด๋๋ฆฌ๊ฐ ์ ์ฅ๋ fs+0x28(0x7ffff7fb1580+0x28)์ ๊ฐ์ ๋ณด๋ฉด, ์์ง ์ด๋ค ๊ฐ๋ ์ค์ ์ด ์๋์ด์๋ค์
์นด๋๋ฆฌ ๊ฐ ์ค์ ๐
watch : ํน์ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๋ ๋ช ๋ น์ด
TLS์ ์ฃผ์๋ฅผ ์์์ผ๋ฏ๋ก, gdb์ watch ๋ช ๋ น์ด๋ก TLS+0x28์ ๊ฐ์ ์ธ ๋ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ์ฃ
watchpoint๋ฅผ ์ค์ ํ๊ณ ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์งํ์ํค๋ฉด Security_initํจ์์์ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถฐ์
๊ทผ๋ฐ ์ ๋ Security_initํจ์๊ฐ ์ ๋ณด์ด๋ค์ ์ ๊ฑฐ Contiune ํ๋ฒ ๋ ํ ๊ฑด๋ฐ๋..
์ฌ๊ธฐ์ TLS+0x28์ ๊ฐ์ ์กฐํํ๋ฉด 0xe15de3b266156800 ์ด ์นด๋๋ฆฌ๋ก ์ค์ ๋ ๊ฑธ ํ์ธํ์ฃ
์ค์ ๋ก ์ด ๊ฐ์ด mainํจ์์ ์ฌ์ฉ๋๋ ์นด๋๋ฆฌ๊ฐ์ด์ง ํ์ธ ํด๋ณผ๊น์?
mov rax,QWORD PTR fs:0x28๋ฅผ ์คํํ๊ณ rax ๊ฐ์ ํ์ธํด๋ณด๋ฉด
security_init์์ ์ค์ ํ ๊ฐ๊ณผ ๊ฐ์ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!!
์นด๋๋ฆฌ ์ฐํ
์นด๋๋ฆฌ๊ฐ ๋ฑ์ฅํ๋ฉด ๋น์ฐํ ์ฐํ ๋ฐฉ๋ฒ๋ ์ฐ๊ตฌ๋ฅผ ํ๊ฒ ์ฃ ์ฐํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
๋ฌด์ฐจ๋ณ ๋์ (Brute Force)
x64 ์ํคํ ์ฒ์์๋ 8๋ฐ์ดํธ์ ์นด๋๋ฆฌ๊ฐ ์์ฑ๋๋ฉฐ, x86 ์ํคํ ์ฒ์์๋ 4๋ฐ์ดํธ์ ์นด๋๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ์นด๋๋ฆฌ์๋ NULL ๋ฐ์ดํธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก, ์ค์ ๋ก๋ 7๋ฐ์ดํธ์ 3๋ฐ์ดํธ์ ๋๋คํ ๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
์ฆ, ๋ฌด์ฐจ๋ณ ๋์ ์ผ๋ก x64 ์ํคํ ์ฒ์ ์นด๋๋ฆฌ ๊ฐ์ ์์๋ด๋ ค๋ฉด ์ต๋ 256^7๋ฒ, x86 ์์๋ ์ต๋ 256^3 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํฉ๋๋ค. ์ฐ์ฐ๋์ด ๋ง์์ x64 ์ํคํ ์ฒ์ ์นด๋๋ฆฌ๋ ๋ฌด์ฐจ๋ณ ๋์ ์ผ๋ก ์์๋ด๋ ๊ฒ ์์ฒด๊ฐ ํ์ค์ ์ผ๋ก ์ด๋ ค์ฐ๋ฉฐ, x86 ์ํคํ ์ฒ๋ ๊ตฌํ ์ ์์ง๋ง, ์ค์ ์๋ฒ๋ฅผ ๋์์ผ๋ก ์ ์ ๋ ํ์์ ๋ฌด์ฐจ๋ณ ๋์ ์ ์๋ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
TLS ์ ๊ทผ
์นด๋๋ฆฌ๋ TLS์ ์ ์ญ๋ณ์๋ก ์ ์ฅ๋๋ฉฐ, ๋งค ํจ์๋ง๋ค ์ด๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉํฉ๋๋ค. TLS์ ์ฃผ์๋ ๋งค ์คํ๋ง๋ค ๋ฐ๋์ง๋ง ๋ง์ฝ ์คํ์ค์ TLS์ ์ฃผ์๋ฅผ ์ ์ ์๊ณ , ์์ ์ฃผ์์ ๋ํ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด TLS์ ์ค์ ๋ ์นด๋๋ฆฌ ๊ฐ์ ์ฝ๊ฑฐ๋, ์ด๋ฅผ ์์์ ๊ฐ์ผ๋ก ์กฐ์ํ ์ ์์ต๋๋ค.
๊ทธ ๋ค, ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ํํ ๋ ์์๋ธ ์นด๋๋ฆฌ ๊ฐ ๋๋ ์กฐ์ํ ์นด๋๋ฆฌ ๊ฐ์ผ๋ก ์คํ ์นด๋๋ฆฌ๋ฅผ ๋ฎ์ผ๋ฉด ํจ์์ ์ํ๋ก๊ทธ์ ์๋ ์นด๋๋ฆฌ ๊ฒ์ฌ๋ฅผ ์ฐํํ ์ ์์ต๋๋ค.
์คํ ์นด๋๋ฆฌ ๋ฆญ
์คํ ์นด๋๋ฆฌ๋ฅผ ์ฝ์ ์ ์๋ ์ทจ์ฝ์ ์ด ์๋ค๋ฉด, ์ด๋ฅผ ์ด์ฉํด ์นด๋๋ฆฌ ๊ฒ์ฌ ์ฐํ ๊ฐ๋ฅ!!
// Name: bypass_canary.c
// Compile: gcc -o bypass_canary bypass_canary.c
#include <stdio.h>
#include <unistd.h>
int main() {
char memo[8];
char name[8];
printf("name : ");
read(0, name, 64);
printf("hello %s\n", name);
printf("memo : ");
read(0, memo, 64);
printf("memo %s\n", memo);
return 0;
}
์ฒซ๋ฒ์งธ ์
๋ ฅ์์ BOF๋ฅผ ์์ผ์ ์นด๋๋ฆฌ์ ๊ฐ์ ์ป์ด๋ด๊ณ ,
BOF์ ๊ฐ์ด ์นด๋๋ฆฌ๊ฐ์ด ๋ฆญ์ด ๋๊ณ , ์ป์ด๋ธ ๊ฐ์ ํ์ฉํด ๊ฒ์ฌ๋ฅผ ์ฐํํจ
์ง์ ๋ ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉฐ, ๋ถ์ํ ์ ์์ง๋ง.. ๋๋ฌด ํ๋ค์ด์ ใ
์ด์งํผ ๋ฌธ์ ํ๋ฉด์ ๋ ํ ๊ฑฐ ์ค๋์ ์ฌ๊ธฐ๊น์ง!!
์ฝ์ค ์์ฝ ๐
์นด๋๋ฆฌ
ํจ์ ์์ ์ ์คํ ๋ฒํผ์ Return Address ์ฌ์ด์ ๋๋ค ๊ฐ์ ์ฝ์
ํ ํ ํจ์ ์ข
๋ฃ ์
ํด๋น ๋๋ค ๊ฐ์ ๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ค์ผ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ
์นด๋๋ฆฌ ์์ฑ
security_initํจ์์์ TLB์ ๋๋ค ๊ฐ์ผ๋ก ์นด๋๋ฆฌ๋ฅผ ์ค์ ํ๋ฉด, ๋งค ํจ์์์ ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ์ฉ
์นด๋๋ฆฌ ์ฐํ ๊ธฐ๋ฒ
- ๋ฌด์ฐจ๋ณ ๋์
๊ณต๊ฒฉ(Brute Force Attack):
- ๋ฌด์ฐจ๋ณ ๋์ ์ผ๋ก ์นด๋๋ฆฌ ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ. ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ต๋๋ค. - TLS ์ ๊ทผ:
- ์นด๋๋ฆฌ๋ TLS์ ์ ์ญ ๋ณ์๋ก ์ ์ฅ๋๋ฏ๋ก, ์ด ๊ฐ์ ์ฝ๊ฑฐ๋ ์กฐ์ํ ์ ์์ผ๋ฉด ์นด๋๋ฆฌ๋ฅผ ์ฐํ - ์คํ ์นด๋๋ฆฌ ๋ฆญ:
- ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ์ ์นด๋๋ฆฌ ๊ฐ์ ์ ์ฅํ๋ฏ๋ก, ์ด๋ฅผ ์ฝ์ด๋ผ ์ ์์ผ๋ฉด ์นด๋๋ฆฌ๋ฅผ ์ฐํ
- ๊ฐ์ฅ ํ์ค์ ์ธ ์นด๋๋ฆฌ ์ฐํ ๊ธฐ๋ฒ์ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ssp_001 (0) | 2022.05.23 |
---|---|
Exploit Tech: Return to Shellcode (0) | 2022.05.03 |
basic_exploitation_001 (0) | 2022.04.27 |
basic_exploitation_000 (0) | 2022.04.27 |
Exploit Tech: Return Address Overwrite (0) | 2022.04.27 |