Thema: Delphi Stack überlauf

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#25

AW: Stack überlauf

  Alt 10. Sep 2016, 08:21
kleines Beispiel ... wird komplizierter, wenn der String noch irgendwo "verrechnet" wird (z.B. mit 'nem Pfad zusammengesetzt)

Delphi-Quellcode:
type
  // For System.pas internal use only.
  // Note, this type is duplicated in getmem.inc for diagnostic purposes. Keep in sync.
  PStrRec = ^StrRec;
  StrRec = packed record
  {$IF defined(CPU64BITS)}
    _Padding: Integer; // Make 16 byte align for payload..
  {$ENDIF}
    codePage: Word;
    elemSize: Word;
    refCnt: Integer;
    length: Integer;
  end;


Size := SizeOf(StrRec) + Length('123456' + #0#0) * SizeOf(Char)
12 + (6+2)*2 = 28 // '123456'
12 + (5+2)*2 = 24 // '12345'

Delphi-Quellcode:
type
  SmallBlockTypes: array[0..NumSmallBlockTypes - 1] of TSmallBlockType =(
    {8/16 byte jumps}
    (BlockSize: 16{$ifdef UseCustomFixedSizeMoveRoutines}; UpsizeMoveProcedure: {$ifdef CPU386)}Move12{$else}Move8{$endif}{$endif}),
    (BlockSize: 24{$ifdef UseCustomFixedSizeMoveRoutines}; UpsizeMoveProcedure: Move20{$endif}),
    (BlockSize: 32{$ifdef UseCustomFixedSizeMoveRoutines}; ...
'1234567' liegt in SmallBlockTypes 32 und davor/dahinter sind 2 Byte Offset frei
'123456' liegt in SmallBlockTypes 32 und davor/dahinter sind 4 Byte Offset frei
'12345' liegt in SmallBlockTypes 28 und davor/dahinter sind 0 Byte Offset frei

Entweder wird mit diesem String irgendwas überschrieben (Overflow) oder irgendwas Anderes überschreibt da was und dein String landet nur zufällig in dem Block, wo das passiert.
$2B or not $2B
  Mit Zitat antworten Zitat