Ich schrieb einige Code in C, die strcpy
einige Eingabedaten in einen deklarierten Puffer sollte. Hier ist der Code:C kopiert in zwei Puffer, obwohl nur einer gefüllt werden sollte
#include <stdio.h>
#include <string.h>
void function(char *args) {
char buff_1[12];
char buff_2[3] = "ABC";
strcpy(buff_1, args);
printf("buff_1: %s \n", buff_1);
printf("buff_2: %s \n", buff_2);
}
int main(int argc, char *argv[]) {
printf("Input: ");
if(argc > 1)
function(argv[1]);
return 0;
}
Wenn ich jetzt die binären laufen würde ich davon ausgehen, dass alles, was mehr als 11 Eingabeargumente in einem Puffer-Überlauf führen würden, aber in Wirklichkeit hängt es meine Eingabe an beiden Puffern:
./main (perl -e 'print "A"x15')
buff_1: AAAAAAAAAAAAAAA
buff_2 :ABCAAAAAAAAAAAAAAA
Überprüfen Sie auch die Variablen, die mit gdb zeigt, dass meine Eingabeargumente in beiden Puffern gespeichert sind:
(gdb) x/1s buff_1
0xffffd284: 'A' <repeats 11 times>
(gdb) x/1s buff_2
0xffffd281: "ABC", 'A' <repeats 11 times>
ich den Code mit dem folgenden Befehl zusammengestellt: gcc -m32 -O0 -g -fno-stack-protector -o main main.c
mit gcc (Ubuntu 5.2.1-22ubuntu2)
Kann jemand erklären, wie das möglich ist?
Was, genau, denkst du, das Ergebnis eines Pufferüberlaufs * sollte * sein? –
Wenn Sie die Adressen der Variablen (mit '% p') ausdrucken, sehen Sie, dass sie sich magisch nebeneinander ausrichten, also wird" ABC "(ohne die fehlende Null am Ende) mit buff_2's folgen Inhalt. – Koshinae
Oder einfach nicht zählen, 'char buff_2 [] =" ABC ";'. Und aktivieren Sie Compiler-Warnungen. – Lundin