Information Security Knowledge

Buffer Overflow

正常情況



  在一般使用 C 或 C++ 等語言編成的程式在使用到固定大小的緩衝區進行資料存取時並不會自己進行緩衝區邊界的檢查,在一般正常使用情況,輸入值(Input data)會小於緩衝區的大小(Buffer size)。

  若程式設計者在設計讀取輸入值至緩衝區時也忽略了檢查輸入值長度時,攻擊者就可以透過輸入一筆較長的資料,以造成程式癱瘓或改變執行流程,通常會搭配 Shellcode 可以執行任意程式碼,而且同時擁有受害程式的權限。





特殊情況















  如上圖所示,當輸入值過長且又沒去檢查是否超過緩衝區長度時,則會使得輸入值覆寫掉一些存在 stack 中的訊息,如圖中的 Return address,當這個存放程式 Call back 位址的 Return address 被修改後,將可能因為寫入的值而導致系統癱瘓或被導向攻擊者寫入 Shellcode 的位址





Buffer Overflow








  如上圖所示,當輸入值過長且又沒去檢查是否超過緩衝區長度時, 則會使得輸入值覆寫掉一些存在 stack 中的訊息,如圖中的 Return address, 當這個存放程式 Call back 位址的 Return address 被修改後, 將可能因為寫入的值而導致系統癱瘓或被導向攻擊者寫入 Shellcode 的位址




按我Overflow


Example





   最簡單的例子就是函式 strcpy(est ,src),因其不檢查輸入長度,所以很容易造成緩衝區溢位, 不過現在程式設計師都會以 strncpy 取而代之。

   假設此時宣告 char buffer[24],再呼叫 strcpy(Buffer,Input),當 Input 大於 24 就有機會覆寫到 原 Stack 中所存放的值,包含暫存器 EIP、EBP 等,就會影響到 Return address 而改變程式執行流程。

   我們可以透過 Ollydbg 等 Debugger 觀察程式的執行流程、暫存器值和 Stack 內容,如下圖可以看到在經過 strcpy 輸入一長串 Input data 後,將造成不可預期的影響。





   而 Shellcode 就是一堆十六進位的代碼組合而成,可以直接被 CPU 辨識執行, 通常會透過 Buffer Overflow 改變程式執行流程到攻擊者存放在記憶體的 Shellcode, 就可以為所欲為了,像是透過下面的程式碼以 xor 計算去改變 EBP 的值。







返回top