Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Assembler ::  Verständnisfrage Buffer overflow     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Rafael81
Unregistrierter




Beitrag Rafael81 Unregistrierter 01:32:17 08.07.2014   Titel:   Verständnisfrage Buffer overflow            Zitieren

Hi Leute,

hätte eine Frage bezüglich des Buffer (stack) overflows.
Auf wikipedia gibt es hier ein Beispiel http://en.wikipedia.org/wiki/Stack_buffer_overflow

C++:
1
2
3
4
5
6
7
8
9
10
11
   float My_Float = 10.5; // Addr = 0x0023FF4C
   char  c[28];           // Addr = 0x0023FF30
 
   // Will print 10.500000
   printf("My Float value = %f\n", My_Float);
 
 
   memcpy(c, bar, strlen(bar));  // no bounds checking...
 
   // Will print 96.031372
   printf("My Float value = %f\n", My_Float);

Hier wird nun offensichtlich my float überschrieben.

Dann gibt es hier wieder ein Beispiel
http://en.wikipedia.org/wiki/Buffer_overflow

C++:
char           A[8] = {};
unsigned short B    = 1979;
strcpy(A, "excessive");

Hier wird nun B überschrieben?
Was ich nicht genau verstehe werden die Variablen über dem Buffer wie im ersten Beispiel oder die darunter wie im 2. Beispiel überschrieben :confused:
Eigentlich müssten die darüber ja überschrieben werden, da das letzte Array Element an der höchsten Addresse steht.
Danke im Voraus!
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 27521
Beitrag SeppJ Global Moderator 02:59:16 08.07.2014   Titel:              Zitieren

Was hat die Frage mit Assembler zu tun?

Wie genau ein Compiler die Variablen zueinander anordnet (sofern Variablen überhaupt noch irgendwie einer bestimmten Speicherposition zugeschrieben werden können, was oftmals nicht mehr der Fall ist) ist im C-Standard nicht vorgeschrieben. Es ist nicht einmal klar, ob überhaupt so etwas wie ein Stack existiert. Manche Compiler haben eine (für eben diesen speziellen Compiler) dokumentierte Anordnung im Falle von unoptimierten Code. Dieses Verhalten kann und wird sich daher von Fall zu Fall unterscheiden und die Beispielcodes auf Wikipedia sind daher hochgradig unportabel. Die sollen auch gar nicht wirklich ausgeführt werden, sondern bloß die Problemstellung verdeutlichen.

Ein kleines bisschen portabler geht es, wenn man die Daten in ein struct packt:
C:
struct
{
  char string[8];
  float number;
} foo;
Hier ist garantiert, dass &foo.string < &foo.number. Zumindest sofern man diese Adressen im Programm explizit benutzt*. Denn wie schon gesagt ist gar nicht klar, ob eine Instanz dieses structs im fertigen Maschinencode überhaupt noch irgendeine Repräsentation im Speicher des Computers hat. Ein C-Compiler hat sehr weitreichende Freiheiten bei der Erzeugung des Codes und wird diese auch großzügig nutzen, wenn er Optimierungen durchführt. Sofern das Programm am Ende sich so verhält als ob es dem C-Standard folgt, darf der Compiler so ziemlich alles machen. Und die Folgen eines Pufferüberlaufs sind im C-Standard explizit undefiniert, dass heißt der C-Compiler muss den Code nicht so erzeugen, dass bei einem Pufferüberlauf das Verhalten auftritt, von dem du denkst, dass es auftreten sollte. Wie schon gesagt existiert ein foo.string eventuell gar nicht mehr wirklich und es passiert wer weiß was, wenn du über dessen Grenzen schreibst.



*: Ein ganz cleverer Compiler könnte natürlich auch diesen Effekt irgendwie simulieren, um die Variablen weg zu optimieren, aber ich denke nicht, dass irgendein real existierender Compiler dies tut.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.


Zuletzt bearbeitet von SeppJ am 03:08:52 08.07.2014, insgesamt 1-mal bearbeitet
Rafael81
Unregistrierter




Beitrag Rafael81 Unregistrierter 08:59:32 08.07.2014   Titel:              Zitieren

Hi,

alles klar, vielen Dank! Dachte die Frage passt hier ganz gut rein, da es so low level ist und entfernt was mit Assembler zu tun hat.
So schlimm ist ein Buffer overflow ja gar nicht, wenn man nicht voraussehen kann, wo die anderen Variablen liegen zum überschreiben. Aber die größere Gefahr ist wohl, dass Shellcode eingeschleust wird.

Viele Grüße
Rafael
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 27521
Beitrag SeppJ Global Moderator 18:20:19 08.07.2014   Titel:              Zitieren

Rafael81 schrieb:

So schlimm ist ein Buffer overflow ja gar nicht, wenn man nicht voraussehen kann, wo die anderen Variablen liegen zum überschreiben.
:confused: Das macht die Sache doch noch viel schlimmer! :eek:

Dein Hacker weiß genau, was passiert, wenn er den Overflow verursacht. Er hat schließlich das fertig übersetzte Programm vorliegen (und wenn nicht, dann kann er leicht raten, was ungefähr passieren wird und ein bisschen ausprobieren). Zur Programmerstellungszeit kannst du nicht genau voraussagen, was passieren wird.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.


Zuletzt bearbeitet von SeppJ am 18:22:41 08.07.2014, insgesamt 1-mal bearbeitet
xor eax,eax
Unregistrierter




Beitrag xor eax,eax Unregistrierter 18:38:24 08.07.2014   Titel:              Zitieren

am besten du schaust dir das im Debugger an.
Dann siehst du wo welche Variablen im Speicher liegen.

Habs z.B. mit deinem Programm kurz probiert.
Egal ob ich zuerst A und dann B definiere oder umgekehrt - der Compiler legt die Variablen immer in der gleichen Reihenfolge auf den Stack.
Das "oben" und "unten" korrespondiert also nicht mit "oben" oder "unten" am Stack!

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string.h>
#include <stdio.h>
 
int main()
{
   
    unsigned short B    = 1979;
    char           A[8] = {0};
   
    printf("\nA=%p",A);
    printf("\nB=%p",&B);
   
    strcpy(A, "excessive");
   
 
    return 0;
}



Assembler:
1
2
3
4
5
6
7
8
9
; die Zuweisung unsigned short B = 1979 verrät die Position von B am Stack
MOV ECX,7BB ; 7BB=1979 in ECX schreiben
MOV WORD PTR SS:[EBP-0x4],CX ; und auf Stackposition EBP-4 schreiben
 
; und die Parameterübergabe am Stack für strcpy verrät die Position von A am Stack
PUSH test.0040C010  ; Adresse von "excessive" auf Stack schreiben
LEA ECX,DWORD PTR SS:[EBP-0x10] ; Adresse von char A[] laden und in ECX speichern
PUSH ECX ; ECX auf Stack schreiben
CALL test.00401070 ; strcpy aufrufen



Somit kennen wir das Stacklayout für deine Funktionsvariablen, 4byte pro Zeile:
Code:
EBP-0x10 | char A[8]: Byte 0 bis 3
EBP-0xC  | char A[8]: Byte 4 bis 7
EBP-0x8  | nicht für Funktionsvariablen verwendet
EBP-0x4  | unsigned short B (2byte) | nicht für Funktionsvariablen verwendet(2byte)
EBP      | nicht für Funktionsvariablen verwendet



Shellcode wird meist auf Programmfehler in bestimmten Versionen ausgerichtet - durchaus möglich dass der gleiche Shellcode nicht mehr funktioniert, wenn das angegriffene Programm mit einer anderen Compilerversion nochmal erstellt wird.
Außerdem bauen viele Compiler Code ins Programm ein, welcher checkt, ob der Stack überschrieben wurde.
Rafael81
Unregistrierter




Beitrag Rafael81 Unregistrierter 21:05:12 08.07.2014   Titel:              Zitieren

okay danke, ist mir jetzt klar! :)
Commingtonite
Unregistrierter




Beitrag Commingtonite Unregistrierter 11:39:08 15.07.2016   Titel:   C Plus Plus            Zitieren

Hab ne frage:
Was tun bei dieser Fehlermeldung (hab gerade erst angefangen :))

1>LINK : fatal error LNK1123: Fehler bei der Konvertierung in COFF: Datei ist ungültig oder beschädigt.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


bitte um Antwort danke
rkhb
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.09.2010
Beiträge: 331
Beitrag rkhb Mitglied 12:26:22 15.07.2016   Titel:   Re: C Plus Plus            Zitieren

Statt sich an einen anderen Thread anzuhängen wäre es besser gewesen. einen neuen Beitrag zu verfassen.

Wahrscheinlich ist dein Visual Studio falsch eingestellt. Ich habe vor etwas längerer Zeit eine Installationsanleitung auf Stackoverflow gepostet:

http://stackoverflow.com/questions/31037176/running-asm-procedure-in-cpp-file/31056748#31056748

und für 64 bit:

http://stackoverflow.com/questions/33751509/external-assembly-file-in-visual-studio/33757749#33757749

HTH

viele grüße
ralph
C++ Forum :: Assembler ::  Verständnisfrage Buffer overflow   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.