Das Disassemblierungsbeispiel "Art of Exploitation" ist nicht dasselbe (C-Code)

8

Ich befolge das Beispiel im Buch "Art of Exploitation", um ein Programm in C zu disassemblieren, während das Buch mit einer eigenen Linux LiveCD geliefert wird, bevorzuge ich BT5 (32 Bit).

Das Codebeispiel ist sehr einfach - (ich habe es gleich verwendet)

%Vor%

Der Autor verwendet

  

gcc dateiname.c

um den Code zu kompilieren, und ich benutze die fast gleiche Syntax, aber mit -o, um den kompilierten Pfad zu speichern, wo ich will.

Dann benutzt er den Befehl -

  

objdump -D Schleife | grep -A20 main.:

um die kompilierte Binärdatei zu untersuchen.

Dies ist seine Ausgabe -

%Vor%

und das ist meine Ausgabe für das gleiche Programm -

root @ bt: ~ # objdump -D Schleife | grep -A20 main.:

%Vor%

Glauben Sie, dass es einen Unterschied gibt, weil ich nicht die gleiche Linux Distribution verwende? Es sieht auch so aus, als ob sein Code die Funktion printf() aufruft, während meine die Funktion puts() aufruft (wie in seinem Beispiel).

    
YSY 07.08.2011, 20:35
quelle

3 Antworten

6

Es muss nicht der Unterschied des Betriebssystems sein, es reicht, wenn Sie eine andere Version von GCC verwenden, um einen anderen Maschinencode / Assemblercode zu erzeugen.

In Bezug auf puts / printf - der Compiler verwendet, was auch immer er entscheidet (in Bezug auf Effizienz, Sicherheit usw.), wenn Sie printf ohne Format aufrufen, es ist nicht notwendig, also verwendet er puts was schneller ist.

    
MByD 07.08.2011, 20:39
quelle
1

Selbst wenn Sie den gleichen Compiler (gcc) verwenden, wird nicht erwartet, dass das Kompilieren auf verschiedenen Maschinen am selben Tag oder an demselben Computer an verschiedenen Tagen zu demselben Ergebnis führt.

Verschiedene Versionen von gcc, 32 bit im Vergleich zu 64 bit usw. Wenn du gcc nicht selbst installiert hast, um genau mit einem vom Autor installierten gcc übereinzustimmen, dann hast du wahrscheinlich eine andere Version und die Erwartung ist, dass der Code anders sein wird. p>

Sobald Sie Optimierungen und andere Befehlszeilenoptionen hinzufügen (die mit der Codegenerierung in Zusammenhang stehen, -o gehört nicht dazu), variieren die Unterschiede auf demselben Computer am selben Tag drastisch.

Ich würde hoffen, dass das nicht der Sinn des Buches ist, ich würde erwarten, dass es Ihnen diese Unterschiede beibringt, aber wie Sie einige Dinge ausnutzen können, wenn Sie sie zufällig produzieren sehen. Im Grunde gehen Sie mit dem, was das Buch gefunden hat, da es wahrscheinlich damit zu tun hat, was das Buch zu lehren versucht.

Unter der Annahme, dass der gleiche Code nie den gleichen Code erzeugt, gehen einige Compiler so weit, dass sie einen Zeitstempel in die Datei schreiben, um sicherzustellen, dass keine zwei Builds genau übereinstimmen. gcc insbesondere entwickelt sich ständig weiter und keine zwei Leute bauen es auf die gleiche Weise, so dass Sie sogar mit der gleichen Quellversion Unterschiede in der Ausgabe sehen können.

    
old_timer 07.08.2011 22:23
quelle
0

Wahrscheinlich eine andere Version des Compilers. Dein optimiert den Aufruf von printf - da es wirklich keine Formatzeichenfolge gibt, könnte der Aufruf von puts etwas schneller sein.

    
Mat 07.08.2011 20:40
quelle

Tags und Links