Was bedeuten die CFI-Richtlinien? (und noch einige Fragen)

8

Ok, das wird eine lange Frage sein. Ich versuche zu verstehen, wie "Pufferüberlauf" funktioniert. Ich lese Den Stapel zum Spaß und Gewinn zerschlagen von aleph1 und habe gerade den folgenden Code entpackt:

> %Vor%

Das disamembly mit -S Flag von GCC gibt mir:

%Vor%

Die .cfi -Direktiven sind nicht in dem Papier von Aleph1 und ich nehme an, dass sie damals nicht benutzt wurden. Ich habe diese Frage zu SO gelesen Ich bekomme, dass sie von GCC für die Ausnahmebehandlung verwendet werden. Ich habe auch eine weitere Frage zu SO und ich gelesen bekommen, dass .LFB0, .LFE0, .LFE1 und .LFB1 sind Etiketten, aber ich habe die folgenden Zweifel:

  1. Ich verstehe, dass .cfi-Anweisungen für die Ausnahmebehandlung verwendet werden, aber ich verstehe nicht, was sie bedeuten. Ich habe hier und sehe einige Definitionen wie:
  

.cfi_def_cfa register, offset

     

.cfi_def_cfa definiert eine Regel für die Berechnung von CFA als: Adresse aus nehmen   registriere und füge Offset dazu hinzu.

Wenn Sie sich jedoch die Disassemblierung ansehen, die ich über gestellt habe, finden Sie keinen Registernamen (wie EAX, EBX usw.), stattdessen finden Sie dort eine Nummer (I habe im Allgemeinen "6" gefunden und ich weiß nicht, wie das ein Register sein soll. Kann jemand erklären, was .cfi_def_cfa_offset 16 , .cfi_offset 6, -16 , .cfi_def_cfa_register 6 und .cfi_def_cfa 7, 8 bedeuten? Was bedeutet CFA ? Ich frage das, weil meistens in Büchern / Papieren die Prozedur prolog wie folgt ist:

%Vor%

Aber jetzt denke ich, dass die Prozedur Prolog in modernen Computern wie folgt ist:

%Vor%

Zuerst dachte ich, dass die CFI-Direktiven anstelle von sub mnemonic verwendet werden, um den Offset zu setzen, aber das ist nicht der Fall; Der Befehl sub wird trotz der Verwendung der CFI-Anweisungen immer noch verwendet.

  1. Ich habe verstanden, dass es für jedes Verfahren Etiketten gibt. Warum befinden sich mehrere verschachtelte Labels in einer Prozedur? In meinem Fall hat main .LFB1 und .LFE2 Labels. Was ist für mehrere Etiketten erforderlich? Ähnlich hat die Prozedur function die Label .LFB0, .L2 und .LFE0

  2. Die letzten drei Zeilen für beide Prozeduren scheinen für einige Funktionen des Housekeeping verwendet zu werden (sagen Sie vielleicht die Größe der Prozedur?), aber ich bin mir nicht sicher, was sie bedeuten. Kann jemand erklären, was sie meinen und was sie benutzen?

BEARBEITEN:

(Hinzufügen einer weiteren Frage)

  1. Nehmen die CFI-Richtlinien Platz ein? Da in der Prozedur "function" jeder int-Parameter 4 Bytes belegt und seine Nummer 3 ist, nehmen alle Parameter 12 Bytes im Speicher ein. Als nächstes nimmt das erste char -Array 8 Bytes (rundet 5 Bytes auf 8 Bytes) auf, und das nächste char -Array braucht 12 Bytes (rund 10 Bytes bis 12 Bytes), so dass das ganze char -Array 20 Bytes braucht. Summieren diese alle, Parameter und lokale Variablen nur 12 + 20 = 32 Bytes.

    Aber in der Prozedur "function" subtrahiert der Compiler 48 Bytes, um Werte zu speichern. Warum?

Pervy Sage 27.06.2014, 23:30
quelle

3 Antworten

1

Wie ich Ihre Anfrage in Reverse Engineering stelle, setze ich den Inhalt meiner Kommentare als Antworten hier ein (ich weiß nicht, ob das so bleiben wird, da ich eine harte Konkurrenz sehe, Ihre Frage da unten abzustimmen) / p>

Lindy Dancer Beantwortet was cfi and cfa means ( call frame information ) und (c all frame address )

.L<num> bezeichnet Labels gemäß verschiedener Leckerbissen in Google in x64 GCC-Namen Alle Labels im folgenden Format beginnen mit .L und enden mit a numeral , also sind .L1 , .L2 , .L....infinity labels

laut Google und einigen früheren SO Antworten BF<num> zeigt Funktion-Begin an und EF<num> zeigt FUNCTION-END

an

so .LBF0 , .LBF1 . LBF.....infinity und .LFE0 ,......., .LFE....infinity

bedeutet, dass die Funktion beginnt und die Funktion in jeder Funktion endet, die der Compiler wahrscheinlich benötigt, um einige interne Anforderungen zu erfüllen, so dass Sie sie in diesem Moment vergessen sollten, es sei denn, es besteht eine sehr ernste Notwendigkeit, in Compiler-Interna zu graben

Das andere Label .L2 existiert, um den Verzweigungsbefehl je in Ihrer Funktion zu adressieren

%Vor%

auch jeder Compiler richtet den Zugriff auf Argumente und Locals auf bestimmte Grenzen aus und puffert diesen auf

Ich kann nicht sicher sein, aber x64 Standard Align ist 16 Bytes, die ich für GCC denke also wenn Sie eine ungerade Reservierung wie

anfordern

char foo [ 5 ] oder
BYTE blah [ 10 ]

Die Indizes 5 and 10 sind nicht ausgerichtet für x86

für 5 x86 compiler will assign 8 byte s and for 10 16 bytes

wie wise x64 gcc might assign 16 bytes für jede Ihrer Anfragen

Sie sollten sich eigentlich keine Gedanken darüber machen, warum der Compiler das tut, was er tut

Wenn Sie versuchen, die Logik der Assembly zu verstehen, konzentrieren Sie sich auf Adressen

Wenn der Compiler entschieden hat, dass es will put x at rbp +/- X ist, wird es also access it at the same location durch den Gültigkeitsbereich oder die Lebensdauer dieser Variablen geben

    
blabb 01.07.2014, 06:44
quelle
9

CFI steht für Call-Frame-Informationen . So beschreibt der Compiler, was in einer Funktion passiert. Es kann vom Debugger verwendet werden, um einen Aufruf-Stack zu präsentieren, vom Linker, um Ausnahmetabellen zu synthetisieren, für Stack-Tiefe-Analyse und andere Dinge wie das.

Effektiv beschreibt es, wo Ressourcen wie Prozessorregister gespeichert sind und wo die Rücksendeadresse ist.

CFA steht für call frame address , was bedeutet, dass die Adresse die Stapelzeigerposition der aufrufenden Funktion ist. Dies wird benötigt, um Informationen über das nächste Bild auf dem Stapel aufzunehmen.

    
Lindydancer 28.06.2014 04:28
quelle
1

Die 48 soll sowohl die Argumente als auch die Einheimischen überspringen. Das 5-Byte-Array ist an einer 8-Byte-Grenze und das 10-Byte an einer 16-Byte-Grenze ausgerichtet. Die Argumente nehmen jeweils 8 Bytes, also 3 * 8 für Argumente plus 8 + 16 für Einheimische ergibt 24 + 24 oder 48. Sie können es in gdb sehen, indem Sie nach der Adresse jedes dieser Dinge fragen.

    
Patrick 22.10.2014 04:26
quelle

Tags und Links