ํ์ต ๋ชฉํ
์๋ก
- Stack Canary : ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ ์์์ ๊ฐ์ ์ฝ์ ํ๊ณ , ํจ์์ ์ํ๋ก๊ทธ์์ ํด๋น ๊ฐ์ ๋ณ์กฐ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ
- ์นด๋๋ฆฌ ๊ฐ์ด ๋ณ์กฐ๋๋ฉด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃ์ํด
์นด๋๋ฆฌ ์๋ ์๋ฆฌ
// canary.c
// compile - no_canary : gcc -o no_canary canary.c -fno-stack-protector
// compile - canary : gcc -o canary canary.c
#include <unistd.h>
int main(){
char buf[8];
read(0,buf,32);
return 0;
}
no_canary vs canary : canary์ ์ถ๊ฐ๋ก ์์ฑ๋ ์ฝ๋
Prologue:
0x00000000000006b2 <+8>: mov rax,QWORD PTR fs:0x28 #1
0x00000000000006bb <+17>: mov QWORD PTR [rbp-0x8],rax #2
0x00000000000006bf <+21>: xor eax,eax
#fs์ gs : ๋ชฉ์ ๋ช
์๋์ง ์์ ์ด์์ฒด์ ๊ฐ ์์๋ก ์ฌ์ฉํ ์ ์๋ ๋ ์ง์คํฐ
#๋ฆฌ๋
์ค์์๋ fs๋ฅผ Thread Local Storage ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ์ฌ์ฉ
Epilogue:
0x00000000000006dc <+50>: mov rcx,QWORD PTR [rbp-0x8] #3
0x00000000000006e0 <+54>: xor rcx,QWORD PTR fs:0x28 #4
0x00000000000006e9 <+63>: je 0x6f0 <main+70> #5
0x00000000000006eb <+65>: call 0x570 <__stack_chk_fail@plt>
--ํ๋กค๋ก๊ทธ--
ํ๋ก์ธ์ค ์์ ์ fs:0x28์ 8๋ฐ์ดํธ(Qword) ํ์์ผ๋ก ๋๋ค ๊ฐ ์ ์ฅ (์นด๋๋ฆฌ ์ญํ )
์์ฑํ ๋๋ค๊ฐ์ main+17์ ์ฝ๋์์ 8๋ฐ์ดํธ ํ์์ผ๋ก rbp-0x8์ ๋ณต์ฌ ์ ์ฅ
--์ํ๋ก๊ทธ--
rbp-0x8์ ์๋ ๋ณต์ฌ๋ ์นด๋๋ฆฌ ๊ฐ(๋ณ์กฐ ๊ฐ๋ฅ์ฑ ์์)์ rcx์ ์ ์ฅ
fs:0x28์ ์๋ ์์ํ ์นด๋๋ฆฌ ๊ฐ์ด๋ rcx์ ์๋ ๋ณ์กฐ ๊ฐ๋ฅ์ฑ ์๋ ๊ฐ์ด๋ ๋น๊ต
[4]์์ ๋ ๊ฐ์ด ๋์ผํ๋ฉด xor๊ณ์ฐ์ผ๋ก ๊ฐ์ด 0์ด ๋จ - je ์กฐ๊ฑด ๋ง์กฑ - ์ ์์ข ๋ฃ
๊ฐ์ด 0์ด ์๋๊ฒฝ์ฐ sbof ์์ฌ - __stack_chk_fail
ํธ์ถ๋ก ์ธํด ๊ฐ์ ์ข
๋ฃ
์นด๋๋ฆฌ๐ค ์์ฑ ๊ณผ์
TLS ์ฃผ์ ํ์
fs ๊ฐ์ ํน์ ์์คํ ์ฝ์ ์ฌ์ฉํด์ผ๋ง rw ๊ฐ๋ฅ
arch_prctl(int code, unsigned long addr)
์์คํ
์ฝ ์ค๋จ์ ์ค์ ํ์ฌ ์กฐ์ฌ ๊ฐ๋ฅ
gdb ๋ช ๋ น์ด - catch : ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ํ๋ก์ธ์ค ์ค์ง
$ gdb -q ./canary
pwndbg> catch syscall arch_prctl # arch_prctl ์บ์นํฌ์ธํธ ์ค์
Catchpoint 1 (syscall 'arch_prctl' [158])
pwndbg> run
catchpoint์์ rdi ๊ฐ์ด 0x1002 -> ARCH_SET_FS์ ์์๊ฐ
์นด๋๋ฆฌ ๊ฐ ์ค์
TLS๋ rsi + 0x28์ ์ ์ฅ๋ ๊ฒ, fs๋ ์ด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ๋จ
์์ง ๋ฐ๊พธ๋ ์ฝ๋์ ๋๋ฌํ์ง ์์ ์ค์ ๋์ง ์์ -> gdb watch๋ก ์ก์ ์ ์์
gdb ๋ช ๋ น์ด - watch : ํน์ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๋ก์ธ์ค ์ค๋จ
pwndbg> watch *(0x7ffff7fed4c0+0x28)
Hardware watchpoint 4: *(0x7ffff7fed4c0+0x28)
์์นํฌ์ธํธ ์ค์ ํ ํ๋ก๊ทธ๋จ ๊ณ์ ์คํ์ํค๋ฉด security_init()์์ ๋ฉ์ถค - ๋ฐ๋
์ฌ๊ธฐ์ TLS+0x28 ๊ฐ์ด ์นด๋๋ฆฌ ๊ฐ์ - x/gx๋ก ํ์ธ ๊ฐ๋ฅ
์นด๋๋ฆฌ ์ฐํ