Stack Canary๐Ÿค...

Fransis__ยท2023๋…„ 6์›” 9์ผ
0

pwn

๋ชฉ๋ก ๋ณด๊ธฐ
5/5

Main : Stack Canary

  1. ํ•™์Šต ๋ชฉํ‘œ

    • ์นด๋‚˜๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค.
  2. ์„œ๋ก 

    • Stack Canary : ํ•จ์ˆ˜์˜ ํ”„๋กค๋กœ๊ทธ์—์„œ ์Šคํƒ ๋ฒ„ํผ์™€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์‚ฌ์ด์— ์ž„์˜์˜ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ณ , ํ•จ์ˆ˜์˜ ์—ํ•„๋กœ๊ทธ์—์„œ ํ•ด๋‹น ๊ฐ’์˜ ๋ณ€์กฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•
      - ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๋ณ€์กฐ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ด
  3. ์นด๋‚˜๋ฆฌ ์ž‘๋™ ์›๋ฆฌ

    • // 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>

        --ํ”„๋กค๋กœ๊ทธ--

        1. ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ์‹œ fs:0x28์— 8๋ฐ”์ดํŠธ(Qword) ํ˜•์‹์œผ๋กœ ๋žœ๋ค ๊ฐ’ ์ €์žฅ (์นด๋‚˜๋ฆฌ ์—ญํ• )

        2. ์ƒ์„ฑํ•œ ๋žœ๋ค๊ฐ’์€ main+17์˜ ์ฝ”๋“œ์—์„œ 8๋ฐ”์ดํŠธ ํ˜•์‹์œผ๋กœ rbp-0x8์— ๋ณต์‚ฌ ์ €์žฅ

        --์—ํ•„๋กœ๊ทธ--

        1. rbp-0x8์— ์žˆ๋Š” ๋ณต์‚ฌ๋œ ์นด๋‚˜๋ฆฌ ๊ฐ’(๋ณ€์กฐ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ)์„ rcx์— ์ €์žฅ

        2. fs:0x28์— ์žˆ๋Š” ์ˆœ์ˆ˜ํ•œ ์นด๋‚˜๋ฆฌ ๊ฐ’์ด๋ž‘ rcx์— ์žˆ๋Š” ๋ณ€์กฐ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ๊ฐ’์ด๋ž‘ ๋น„๊ต

        3. [4]์—์„œ ๋‘ ๊ฐ’์ด ๋™์ผํ•˜๋ฉด xor๊ณ„์‚ฐ์œผ๋กœ ๊ฐ’์ด 0์ด ๋จ - je ์กฐ๊ฑด ๋งŒ์กฑ - ์ •์ƒ์ข…๋ฃŒ

        4. ๊ฐ’์ด 0์ด ์•„๋‹๊ฒฝ์šฐ sbof ์˜์‹ฌ - __stack_chk_fail ํ˜ธ์ถœ๋กœ ์ธํ•ด ๊ฐ•์ œ์ข…๋ฃŒ

  4. ์นด๋‚˜๋ฆฌ๐Ÿค ์ƒ์„ฑ ๊ณผ์ •

    1. 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์˜ ์ƒ์ˆ˜๊ฐ’

    2. ์นด๋‚˜๋ฆฌ ๊ฐ’ ์„ค์ •

      • rsi ๊ฐ’ 0x7ffff7fed4c0์ด๋ฏ€๋กœ

      TLS๋Š” rsi + 0x28์— ์ €์žฅ๋  ๊ฒƒ, fs๋Š” ์ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๋จ

      ์•„์ง ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•„ ์„ค์ •๋˜์ง€ ์•Š์Œ -> gdb watch๋กœ ์žก์„ ์ˆ˜ ์žˆ์Œ

      gdb ๋ช…๋ น์–ด - watch : ํŠน์ • ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค ์ค‘๋‹จ

      pwndbg> watch *(0x7ffff7fed4c0+0x28)
      Hardware watchpoint 4: *(0x7ffff7fed4c0+0x28)

      ์›Œ์น˜ํฌ์ธํŠธ ์„ค์ • ํ›„ ํ”„๋กœ๊ทธ๋žจ ๊ณ„์† ์‹คํ–‰์‹œํ‚ค๋ฉด security_init()์—์„œ ๋ฉˆ์ถค - ๋ฐ”๋€œ

      ์—ฌ๊ธฐ์„œ TLS+0x28 ๊ฐ’์ด ์นด๋‚˜๋ฆฌ ๊ฐ’์ž„ - x/gx๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

  5. ์นด๋‚˜๋ฆฌ ์šฐํšŒ

    1. ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… - ๋ถˆ๊ฐ€๋Šฅ (x64 -> 256^7, x32 -> 256^3)
    2. TLS ์ ‘๊ทผ
      • ์นด๋‚˜๋ฆฌ๋Š” TLS์— ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ €์žฅ - ํ•จ์ˆ˜๋งˆ๋‹ค ์ฐธ์กฐ
      • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ TLS ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ด๊ณ  RW ๊ถŒํ•œ ์ฃผ์–ด์ง€๋ฉด ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์กฐ์ž‘ ๊ฐ€๋Šฅ
      • sbof๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์•Œ์•„๋‚ธ ์นด๋‚˜๋ฆฌ ๊ฐ’ or ์กฐ์ž‘ํ•œ ์นด๋‚˜๋ฆฌ ๊ฐ’์œผ๋กœ ๋ฎ์œผ๋ฉด ์นด๋‚˜๋ฆฌ ๊ฒ€์‚ฌ ์šฐํšŒ ๊ฐ€๋Šฅ
profile
_DM_S_1W_ | KH2P

0๊ฐœ์˜ ๋Œ“๊ธ€