簡體   English   中英

Delphi中的緩沖區溢出漏洞

[英]Buffer overflow vulnerability in Delphi

我很想知道,Delphi 是否容易受到緩沖區溢出攻擊? 我讀了一些頁面,其中提到 Delphi 對那個 vuln 是安全的,因為“Delphi 可以使用 Pascal 字符串以及通用 windows 字符串 (PChar)。當與 Win ZDB974238714CA8DE6434A7CE1D083A 連接時,除了使用 Pchar1 之外沒有其他選項。” 真的嗎? 謝謝

Delphi 是否容易受到緩沖區溢出攻擊?

大多數語言都容易受到緩沖區溢出攻擊。 緩沖區溢出是編碼錯誤,而不是語言缺陷。 例如,在 Delphi 中:

var
  buf: array[0..0] of Byte;
  i: Integer;
begin
  Move(buf, i, sizeof(i)); // buffer overflow!
  PInteger(@buf)^ := i;    // buffer overflow!
end;

如果您不小心,大多數語言會讓您在腳下開槍。 編譯器能做的只有這么多。 並非所有事情都可以在編譯時避免。 編程不僅僅是編寫可編譯的代碼,還涉及編寫在運行時正確且負責任地運行的代碼。

某些語言可能會以在運行時執行邊界檢查的方式包裝緩沖區,從而降低緩沖區溢出的風險。 Delphi 不是這些語言之一,因為它允許您直接在原始 memory 上進行操作,因此您幾乎可以做任何您想做的事情(好吧,不管底層操作系統讓您做什么,無論如何)。 這對於 Pascal 字符串來說當然是正確的。

我讀了一些頁面,其中提到 Delphi 對那個 vuln 是安全的,因為“Delphi 可以使用 Pascal 字符串以及通用 windows 字符串 (PChar)。

Delphi 沒有避免所有可能的緩沖區溢出的功能。 但是,如果您編寫代碼以正確且合理地使用緩沖區,則不太可能發生溢出。 這也不僅限於字符串。

與 Win API 連接時,除了使用 Pchar 沒有其他選擇。是這樣嗎?

這取決於特定的 API。 大多數使用簡單的以 null 結尾的PChar字符串,是的。 但有些使用UNICODE_STRING記錄,這些記錄使用不保證以空值終止的WideChar緩沖區。 一些使用 ActiveX/COM BSTR (Delphi WideString ) 字符串代替。

Delphi 為 IDE? 也許。 作為語言? 當然。 自己判斷:

var
  s: String;
  i: Integer;
begin
  s:= 'four';  // Length of string: 4 characters
  for i:= 1 to 1138 do begin  // This loop goes WAY beyond the String's buffer
    write( s[i] );  // What will it access after i=4?
  end;
end;

需要PChar是因為 WinAPI 不是為 Pascal 構建的,但 Pascal 需要為 API 彎曲。 緩沖區溢出是一個問題,但它不像PChar是放射性的,而String是耶穌——這取決於程序員不要過於愚蠢。

緩沖區溢出攻擊與任何特定語言無關。 只有當開發人員錯誤地編碼了他的應用程序時,這些攻擊才有可能發生。

簡而言之,當使用來自外部的數據寫入 memory 時,您作為開發人員有責任編寫所有測試。 您必須始終檢查數據長度是否正確以適合您編寫它。

對於 Delphi,有一些工具可以幫助檢測緩沖區溢出(或下溢和許多其他錯誤)。 例如madExcept 此工具不會防止緩沖區溢出,如果您的程序溢出動態分配的緩沖區,它將立即。 這是一個測試工具,不應在發布版本中提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM