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

你 PWN 不動我@HackerSir 10th

YJK
September 01, 2024
4

你 PWN 不動我@HackerSir 10th

YJK

September 01, 2024
Tweet

Transcript

  1. Syscall • System call • 跟 kernel 作溝通 • Linux

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

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

    shellcode 寫到全域變數 • 透過 Overflow 跳過去
  4. orw

  5. Demo • 編譯選項 ◦ gcc test.c -o dynamic ◦ gcc

    test.c -o static -static • 觀察一下 ◦ file ◦ ls ◦ objdump ◦ gdb
  6. ls

  7. ASM

  8. 差異 • static 很大,dynamic 很小 • static linking 會將所有程式碼包進去 ◦

    call 到任何外部 function 都會包進去 ▪ scanf、printf… • 浪費空間
  9. ASM

  10. Dynamic Linking • 一個程式會呼叫許多 library function • libc.so • .so、.dll

    • 上週提到的 plt、got 就是如此 • 需要使用時再呼叫 libc • 可以重複利用,不浪費空間
  11. ROP • ROP (Return Oriented Programming) • 重複利用編譯的程式碼繞過 NX •

    透過多段可以執行的 gadget 串出 rop chain • 控制執行流程
  12. ROP Gadgets • 片段可執行的程式 • 通常結尾為 ret 或是 jump <addr>

    • 較常利用 ◦ 可以控制 register ◦ 可以寫入資料 ◦ syscall • 如何找到 gadget ◦ ROPgadget Tool
  13. ROP 原理 • Overflow 並串成右方後 • 0x419afc:pop rax ; ret

    • 0x40a48d:pop rsi ; ret • 0x402020:pop rdi ; ret AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  14. ROP 原理 • 0x419afc:pop rax ; ret • rax =

    0x3b AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  15. ROP 原理 • 0x40a48d:pop rsi ; ret • rsi =

    0 AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  16. ROP 原理 • 0x402020:pop rdi ; ret • rdi =

    0 AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  17. ROP 原理 • 執行到最後 Register 會變成 • rax:0x3b • rsi:0

    • rdi:0 AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  18. ROP 原理 • 執行到最後 Register 會變成 • rax:0x3b • rsi:0

    • rdi:0 • 串成可以成功 ROP 的樣子 AAAAAAAA 0x419afc 0x3b 0x40a48d 0 0x402020 0 ……
  19. Static ROP • static linking binary • 先將 ROP Gadget

    全部找出來存到檔案 ◦ ROPgadget --binary <binary> > gadget • 利用 grep 找到想要的 gadget ◦ cat gadget | grep "pop rdi"
  20. Static ROP • 常用 ◦ pop <reg>;ret 控制 register ◦

    mov qword ptr [reg], reg ; ret; 寫入 memory ◦ syscall
  21. Static ROP • 目標:execve(“/bin/sh”, argv, envp) • Linux System Call

    Table NR Syscall references %rax arg0 (%rdi) arg1 (%rsi) arg2 (%rdx) 59 execve man/cs/ 0x3b const char *filename const char *const *argv const char *const *envp
  22. 整理 • execve 的 argv、envp 可以放 NULL • 用 mov

    qword ptr [reg], reg ; ret; 寫 “/bin/sh” ◦ 用 gdb 開 vmmap 找可寫區域
  23. 整理 • execve 的 argv、envp 可以放 NULL • 用 mov

    qword ptr [reg], reg ; ret; 寫 “/bin/sh” ◦ 用 gdb 開 vmmap 找可寫區域 • 用 pop <reg> ; ret ; 調整 register • 最後 syscall
  24. 整理 • syscall number = rax = 0x3b • rdi

    = &"/bin/sh" (pointer to string "/bin/sh") • rsi = 0 • rdx = 0
  25. 偷吃步 • 利用 ROPgadget 生成 ROP chain • ROPgadget --binary

    <file> --ropchain • 有機會長出很白癡的 ROP chain
  26. What is format string • printf、scanf 透過格式化傳遞參數 • scanf("%s", s);、printf("Hello,

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

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