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).
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.
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.
Tags und Links c assembly disassembly