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

Assembly@HackerSir 10th

YJK
August 31, 2024
2

Assembly@HackerSir 10th

YJK

August 31, 2024
Tweet

Transcript

  1. 語言分層 層級 優點 缺點 範例 高階語言 易學易懂 除錯容易 執行效率差 佔用記憶體

    C、C++、 Python 低階語言 執行效率高 執行速度快 相容性差 不易維護 組合語言 機器語言
  2. Why learn ASM? • 許多語言會編譯成機器語言 (由一堆 0101 組成) • 要

    Reverse 編譯好的程式,可以反組譯成 ASM 變成可讀程式碼
  3. C compiled into machine code Source code Assembly code Preprocessor

    前處理器 & Compiler 編譯器 Library/ Object Executable Machine code Assembler 組譯器 Linker 連結器
  4. Reverse Source code Assembly code Preprocessor 前處理器 & Compiler 編譯器

    Library/ Object Executable Machine code Assembler 組譯器 Linker 連結器 decompile
  5. You should know about ASM • Registers • Flags •

    Sections • Instructions • Stack frame
  6. Registers • QWORD: 64 bits, Quad Word • DWORD: 32

    bits, Double Word • WORD: 16 bits • BYTE: 8 bits
  7. 通用暫存器 Register AX、BX、CX、DX, DI、SI、BP、SP R8 ~ R15 64 bit 前綴加

    R ex:RAX、RDI 不變 ex:R8、R9… 32 bit 前綴加 E ex:EAX、EDI 後綴加 D ex:R8D、R9D… 16 bit 不變 ex:AX、DI 後綴加 W ex:R8W、R9W… 8 bit 後面有 X,將 X 取代成 H/L 後面是 I/P,後綴加 L ex:AH、BL、DIL、BPL 後綴加 B ex:R8B、R9B…
  8. 區段暫存器 名稱 作用 CS 指向 Code Segment DS 指向 Data

    Segment SS 指向 Stack Segment ES、FS、GS 指向 data segment (選擇性使用)
  9. 指標暫存器 名稱 作用 SP Stack Pointer 指向 stack 頂端 BP

    Base Pointer 指向 stack 的任何位置 IP 指向目前執行指令的地址 SI、DI Source/Destination Index 指向資料來源、資料目的地
  10. 旗標暫存器 名稱 作用 CF Carry Flag 最高位元有進位或借位,CF = 1;否則為 0

    PF Parity Flag 判斷在運算後最低 8 位元的 1 個數 奇數個 PF = 1,否則為0 AF Auxiliary Flag 運算後,第 3 位元產生進位或借位 AF = 1;否則為 0 ZF Zero Flag 運算後,結果為 0,則 ZF = 1;否則為 0
  11. 旗標暫存器 名稱 作用 SF Sign Flag 運算後,SF = 1,表示負數;否則為 0

    OF Overflow Flag 運算後,結果溢位,OF = 1,否則 為 0 TF Trap Flag 用於 Debug,TF = 1,執行時一次執行一個指令 DF Direction Flag 字串運算,DF = 0,低位到高位;DF = 1,則反之 IF Interrupt Flag IF = 1 時,可以接受外部中斷,IF = 0 則無法
  12. Sections 區段 說明 .bss 存放未初始化全域變數 .data 存放初始化全域變數 .rodata 存放只可讀不可寫的資料 .text

    存放編譯後的程式碼 .init 程式開始前會執行的程式碼 .fini 程式結束時會執行的程式碼 .plt 儲存執行程式碼宣告函式庫的所有函式 .got 儲存已呼叫過的函式
  13. Sections 區段 說明 .bss 存放未初始化全域變數 .data 存放初始化全域變數 .rodata 存放只可讀不可寫的資料 .text

    存放編譯後的程式碼 .init 程式開始前會執行的程式碼 .fini 程式結束時會執行的程式碼 .plt 儲存執行程式碼宣告函式庫的所有函式 .got 儲存已呼叫過的函式
  14. 常見 指令 作用 範例語法 push 將資料放進 stack push rbp pop

    將資料從 stack 拿出 pop rbp mov 將資料從 A 放入 B mov B, A ret 回傳 ret lea 將變數位址複製給暫存器 lea rax, [rbp-0xc] nop 無任何操作 nop
  15. 基本運算 指令 作用 範例語法 inc 將變數加 1 inc rax dec

    將變數減 1 dec rax add 將變數加指定數目 add rax, 0x1 sub 將變數減指定數目 sub rax, 0x1 mul 將變數相乘 mul cx div 將變數相除 div cx
  16. 位元運算 指令 作用 範例語法 and 做 & 運算 and al,

    0x05 or 做 | 運算 or al, 0x05 xor 做 ^ 運算 xor al, 0x05 not 做 ! 運算 not al neg 計算二進位補數 neg al shl/shr 左/右移指定位數 shl rax, 2 rol/ror 左/右循環位移指定位數 rol rax, 2
  17. 其他 指令 作用 範例語法 cmp 由相減比較兩數 設定 ZF、CF cmp rax,

    rbx test 由 & 比較兩數 設定 SF、ZF、PF test rax, rax jmp 跳轉到指定 address jmp 0x00001140
  18. 跳轉指令 • ASM 有許多跳轉指令 • 統稱 Jcc,Jump condition code •

    通常搭配比較指令使用 • 語法:Jcc [跳轉到的 address]
  19. Jcc for unsigned number 指令 跳轉條件 ja > jae >=

    jb < jbe <= jna !> jnae !>= jnb !< jnbe !<=
  20. Jcc for signed number 指令 跳轉條件 jg > jge >=

    jl < jle <= jng !> jnge !>= jnl !< jnle !<=
  21. Jcc for flag 指令 跳轉條件 jc CF = 1 jo

    OF = 1 jp PF = 1 js SF = 1 jz ZF = 1
  22. Function call • call 指令會 call function • 參數儲存會因架構有不同方式 •

    x86:將變數 push 到 stack • x64:將變數儲存到 register
  23. x86

  24. Stack frame Stack frame of add3() Stack frame of add2()

    Stack frame of add1() Stack frame of main()
  25. picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] >

    0x71c • jump to <asm1+37> • [ebp+0x8] == 0x8be
  26. picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] >

    0x71c • jump to <asm1+37> • [ebp+0x8] == 0x8be • [ebp+0x8] – 0x3 = 0x8bb
  27. picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] >

    0x71c • jump to <asm1+37> • [ebp+0x8] == 0x8be • [ebp+0x8] – 0x3 = 0x8bb • 0x8bb
  28. picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] =

    0x2e • [ebp-0x8] = 0xb • jmp <asm2+28>
  29. picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] =

    0x2e • [ebp-0x8] = 0xb • jmp <asm2+28> • [ebp-0x8] <= 0x63f3
  30. picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] =

    0x2e • [ebp-0x8] = 0xb • jmp <asm2+28> • [ebp-0x8] <= 0x63f3 • jump to <asm2+20>
  31. picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] =

    0x2e • [ebp-0x8] = 0xb • jmp <asm2+28> • [ebp-0x8] <= 0x63f3 • jump to <asm2+20> • [ebp-0x4] += 1 • [ebp-0x8] -= 0xffffff80
  32. picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] =

    0x2e • [ebp-0x8] = 0xb • jmp <asm2+28> • [ebp-0x8] <= 0x63f3 • jump to <asm2+20> • [ebp-0x4] += 1 • [ebp-0x8] -= 0xffffff80 Loop!!