Upgrade to Pro — share decks privately, control downloads, hide ads and more …

From 0 to Shell PWN Basic

Avatar for YJK YJK
June 14, 2025
2

From 0 to Shell PWN Basic

Avatar for YJK

YJK

June 14, 2025
Tweet

Transcript

  1. Whoami • YJK • 逢甲大學黑客社學術部長 • AIS3 Junior 2024 助教

    • MyFirstCTF 2024 銅質獎 • 2022 & 2023 T 貓盃資安基礎實務能力競賽 佳作 • ICPC 2023 Taoyuan Regional High Honors • Pwn & Reverse & IoT Security & 演算法
  2. How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼

    ◦ 組合語言 Start Input Output aborted segmentation fault
  3. How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼

    ◦ 組合語言 • 利用漏洞 ◦ 控制執行流程 ◦ 覆蓋 return address ◦ 修改變數
  4. How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼

    ◦ 組合語言 • 利用漏洞 ◦ 控制執行流程 ◦ 覆蓋 return address ◦ 修改變數 ◦ Get Shell
  5. ELF • Executable and Linkable Format • 可執行檔 ◦ Windows:exe

    ◦ Linux:ELF • Section ◦ 執行時會映射到記憶體上 ◦ .text、.bss、.data、.rodata、.got、.plt…
  6. Session • .bss ◦ 存放未初始化的全域變數 • .data ◦ 存放初始化的全域變數 •

    .rodata ◦ 存放可讀不可寫資料 • .text ◦ 存放編譯後的程式碼
  7. Protections • PIE ◦ Position-Independent Executable • NX ◦ No-Execute

    • Stack Canary ◦ stack protector • RELRO ◦ Relocation Read-Only
  8. PIE • Position-Independent Executable • code & data section map

    到位址時隨機 • 開啟時,每次執行都不同,否則固定 address • 需搭配 ASLR 使用
  9. PIE • Position-Independent Executable • code & data section map

    到位址時隨機 • 開啟時,每次執行都不同,否則固定 address • 需搭配 ASLR 使用 • 關閉方式
  10. ASLR • Address Space Layout Randomization • 針對 Process 的防護機制

    • 動態載入位址隨機 ◦ library ◦ stack ◦ heap
  11. Stack Canary • Stack Protector • rbp 前塞 8 byte

    random 值,ret 驗證是否相同 • 1st byte 為 null byte • 每次執行的值不同 • 防範 buffer overflow
  12. Stack Canary • Stack Protector • rbp 前塞 8 byte

    random 值,ret 驗證是否相同 • 1st byte 為 null byte • 每次執行的值不同 • 防範 buffer overflow • 關閉方式
  13. RELRO • Relocation Read-Only • No / Partial / Full

    • 防範 Lazy Binding、GOT Hijacking 問題
  14. Buffer Overflow • 記憶體狀況 low address int num1 int num2

    char buf[0x10] int num3 int num4 save rbp return address high address
  15. Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 low

    address int num1 int num2 char buf[0x10] int num3 int num4 save rbp return address high address
  16. Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 •

    正常輸入範圍 low address int num1 int num2 ‘A’ * 0x10 int num3 int num4 save rbp return address high address
  17. Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 •

    Overflow!!!! low address int num1 int num2 AAAAAAAAAAAAAAAA AAAA AAAA save rbp return address high address
  18. Overwrite Variable • 透過 buffer Overflow 控制變數 • int num3

    = 0x12345678 • int num4 = 0x90abcdef low address int num1 int num2 AAAAAAAAAAAA 0x12345678 0x90abcdef save rbp return address high address
  19. other vulnerable function • gets • scanf • strcpy •

    sprintf • memcpy • strcat • 沒控制好 read 參數 • 涉及 memory/IO 的 function 皆有可能有狀況
  20. Overwrite Return Address • 透過 Buffer Overflow 改變 return address

    • 可以改寫到任意 address • 必須關閉 PIE 或事先 Leak PIE
  21. How to debug ? • 透過 gdb.attach 到執行的 process •

    開啟一個視窗,可以執行 gdb 的各種操作 • 也可以透過 tmux • context.terminal = ["tmux", "splitw", "-h"]
  22. GOT • library 位址載入時才決定 • 編譯時無法得知 library function 位址 •

    GOT 儲存 library function 的指標陣列 • 一開始不會得之真實位置,而是填入位於 plt 的 code
  23. GOT Hijacking • 由於 Lazy Binding,GOT 可寫 • 如果可以覆蓋到 GOT

    的值,下次呼叫到 function 時即 可控制將要執行的 function pointer • Ex:陣列沒驗證輸入區域、記憶體
  24. Syscall • System call • 跟 kernel 作溝通 • Linux

    System Call Table • 常見 ◦ execve(“/bin/sh”,NULL,NULL) ◦ open、read、write
  25. How to write Shellcode? • 自己寫 asm 並透過 pwntools 轉換

    • Shellcode database • pwntools 的 shellcraft ◦ 要記得 context.arch
  26. ret2sc • 沒有 backdoor 可以使用 ◦ 自己寫出 backdoor • 將

    shellcode 寫到全域變數 • 透過 Overflow 跳過去
  27. What is format string • printf、scanf 透過格式化傳遞參數 • scanf("%s", s);、printf("Hello,

    %s\n", s); • 分別讀取格式化字串,讀取到 %s 將參數傳入解析
  28. Type • %[parameter][flags][field width][.precision][length]type • d/I、u:整數 • x/X:16 進位 •

    o:10 進位 • c、s:字元、字串 • p:指標 • n:可以寫入變數