棧區溢出筆記

參考:https://sploitfun.wordpress.com/2015/

https://sploitfun.wordpress.com/2015/05/08/classic-stack-based-buffer-overflow/

等文章所編寫

0x01 Basic 架構與指令

  • 架構是CPU廠商給屬於同一系列的CPU定義的一個規範
    • arm、mits、arm64...、x86、amd64
  • 指令集:就是CPU中用來計算和控制計算機的一套指令,相互結合的系統

類比

  • 不同的二進制組合代表不同的含義,生成了不同含義的計算機指令和程序編碼
  • 例子:jmp機器碼E9 1101001

機器碼與匯編語言

    • 機器碼是交給計算機的指令(數字)
    • 匯編語言是不同機器碼,人爲翻譯成相應的自然語言
      • Jmp > 匯編指令
      • 0xE9 > 機器碼(要轉換成匯編需要編譯器)

寄存器

變量 $a > 寄存到對應的位置例子:10 ↔ 0xA

内存:依次排著數據

TIPS:1bit = 1位、1byte = 8bit = 1字節

基礎的寄存器

  • AX、BX、CX、DX通用寄存器,在運算過程中高低位有特殊含義
  • SP、BP棧幀指向寄存器
    • SP 棧最上頭
    • BP 棧最下頭
  • IP代碼段位置指向寄存器
    • CSIP寄存器,PC寄存器
    • 被IP所指的地方就是指令

專業名稱:

  • AH&AL=AX(accumulator)累加寄存器
  • BH&BL=BX(base)基址寄存器
  • CH&CL=CX(count)計數寄存器
  • DH&DL=DX(data)數據寄存器
  • BP(Base Pointer)基址指針寄存器
  • SP(Stack Pointer)堆棧指針寄存器
  • IP(Instruction Pointer)指令指針寄存器

數據指令

數據全部存在内存

0xE9

棧(Stack)

SP寄存器>TOP
DWORD
DWORD
DWORD
DWORD
DWORD
DWORD
DWORD
BP寄存器>BASE

基本匯編指令

Add
Sub
Push
Pop
Ret = pop $ip
Call 函數名稱 = push $ip + 1(下一條指令位置)
jmp函數地址(offsite)

Call指令先讀取,$ip寄存器向下挪動一條,再去執行Push和jmp指令,ip指向哪,就會跳轉到哪裏

寄存器

esp(棧頂)、ebp(棧底)、eip(程序即將執行的指令的地址)

棧溢出的基本原理

函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等。称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶;在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态。函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。

点赞
  1. Eternal说道:
    Google Chrome Windows 10

    ?

    1. Po7mn1 IceCliffs说道:
      Google Chrome Windows 10

      ?

      1. 汉武先锋说道:
        Opera Windows Vista

        ?

        1. Po7mn1 IceCliffs说道:
          Google Chrome Windows 10

          ??

发表评论

电子邮件地址不会被公开,只有你知道( ̄▽ ̄)"