2012-04-11 2 views
1

Ich arbeite an einer Hausaufgabe, wo wir ein Programm ausnutzen sollen, das anfällig für einen Pufferüberlauf ist. Wir tun dies, indem wir ein großes char Array erstellen und es zuerst vollständig ohne Betriebsanweisungen füllen.Wie man Multi-Character Constant Warnung beheben kann

Ich glaube, was ich tun soll, ist bösartigen Code in irgendwo im Puffer kopieren (dieser Teil kann ich gut tun), und ändern Sie dann die Absenderadresse der ausnutzbaren Funktion irgendwie, so dass es auf wo der bösartige Code zeigt ist.

Ich kenne die Adresse, die ich einstellen möchte (sagen wir ½¾¿º), aber ich bekomme einige Warnungen und weiß nicht, was sie verursacht werden.

Dies ist der Code (im Wesentlichen), die die Warnung verursacht:

int start_of_return_address = 10; 
chars[start_of_return_address + 0] = '½'; 
chars[start_of_return_address + 1] = '¾'; 
chars[start_of_return_address + 2] = '¿'; 
chars[start_of_return_address + 3] = 'º'; 

Die Warnungen ich für jede Aufgabe bekommen sind:

warning: overflow in implicit constant conversion 
warning: multi-character character constant 

I durch Umwandlung bdbebfba die Adresse bekam (Adresse bösartigen Code) in Zeichen (½¾¿º).

Irgendwelche Ideen, was könnte die Warnung verursachen, oder eine andere Möglichkeit, wie ich eine Adresse in ein Zeichen-Array kopieren kann?

Bitte beachten Sie, dass dies für Hausaufgaben ist.

+0

Wie haben Sie 'bdbebfba' in 'Zeichen' umgewandelt? – ArjunShankar

Antwort

4

Ich denke, Ihre Konvertierung von bdbebfba zu Zeichen ist verdächtig.

Wenn das ist die Adresse, und wenn ich es in einem Zeichen-Array speichern möchte, würde ich tun:

chars[start_of_return_address + 0] = 0xbd; 
chars[start_of_return_address + 1] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 3] = 0xba; 

Es ist ein 4-Byte-Wert, so dass es wird passen in 4 Zeichen.

Ich denke, endian-ness ist auch wichtig. Wenn das System Little-Endian (x86) ist, dann geht das niedrigstwertige Byte in die untere Adresse (und Sie kehren die Reihenfolge der Zuweisung um).

chars[start_of_return_address + 4] = 0xbd; 
chars[start_of_return_address + 3] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 1] = 0xba; 
+0

Das war es! Vielen Dank! Diese Endian-Ness war in der Tat ein wichtiger Faktor (2. Satz Code funktioniert), also danke auch für diesen Schnitt. – Fred

1

Die Zeichenliterale Sie uns zeigen ('½', '¾', '¿', 'º') nicht als 'multi Konstanten interpretiert werden. So wie sie sind, bin ich der Meinung, dass es sich um ein Codierungsproblem handelt: Sie könnten zum Beispiel als UTF-8 (und somit als zwei Bytes) in der Quelle kodiert sein, aber der Compiler erwartet eine andere Kodierung (sagt das Latin-1) - Wenn ich recht habe, werden sie als '½', '¾', '¿', 'º' gesehen und berücksichtigen, dass es zwei Zeichen in der Konstante gibt.