2017-11-26 5 views
-2

das folgende Programm verwenden, ich versuche, einen Pufferüberlauf zu erreichen:Programm wird nicht erwartet, dass PC-Registry-Adresse für Pufferüberlauf Rückkehr

#include <stdio.h> 
#include <string.h> 

void vuln(){ 
    char buff[16]; 
    scanf("%s",buff); 
    printf("You entered: %s\n",buff); 
} 

void secret(){ 
    printf("You shouldn't be here."); 
} 

int main(){ 
    vuln(); 
    return 0; 
} 

Wenn AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMM als Eingang der Eingabe das Crash-Protokoll meldet, dass R15 (PC) Register enthält den Wert 0x46464644

Meine Frage ist warum ist nicht die Adresse 0x46464646? Wie geht es mit drei Fs, gefolgt von einem D? Das erwartete Ergebnis sollte 0x46464646 sein, da die Daten überschrieben werden sollten.

Crash Log

+2

Sie außerhalb der Grenzen gehen und [* undefiniert Verhalten *] (https://en.wikipedia.org/wiki/Undefined_behavior). Das bedeutet, dass wirklich alles passieren kann, einschließlich der Erzeugung von [nasalen Dämonen] (http://catb.org/jargon/html/N/nasal-demons.html) oder des Verhaltens, das du siehst. –

+0

Doch die Probleme mit Cyber-Sicherheit nutzen die Tatsache, dass, was auch immer passiert, wiederholt auftritt. Ich empfehle diesen empirischen Ansatz, um Themen der Cybersicherheit zu verstehen. – lockcmpxchg8b

Antwort

3

ARM-Befehle ausgerichtet sind, entweder auf einer 2-Byte- oder 4-Byte-Grenze, je nachdem, ob sie Daumen oder ARM sind Anweisungen. Dies bedeutet, dass das LSb der legalen Verzweigungsziele immer Null ist. ARM nutzte dies und verwendete die LSb einer Verzweigungsadresse (für einige Verzweigungsbefehle), um anzugeben, ob zwischen ARM und THUMB umgeschaltet werden sollte.

Es ist höchstwahrscheinlich, dass Sie die gespeicherte LR mit 0x46464645 oder 0x46464646 überschrieben haben, und dann der Prozessor Ihre LSb (oder LS2bs) verworfen (möglicherweise verwenden, um den Modus zu wählen, wenn Code am Ziel ausgeführt wird).

Versuchen Sie, das letzte Ihrer E-Zeichen oder das erste Ihrer F zu etwas mit erkennbaren oberen 6 Bits zu ändern, um diese Hypothese zu testen. (Angenommen, Ihr ARM läuft mit Little-Endian.) Es ist wahrscheinlich das erste 'F', das die Ausrichtungsanforderungen von ARM berücksichtigt.

Edit: Warum sind Leute diese Frage abstimmen? Es ist interessant und gefragt.

Hier ist ein Hinweis auf das Verhalten auf Verzweigung, die den Modus-Schalter erwähnt: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489e/Cihfddaf.html

+0

Weil die offensichtliche Antwort 'scanf ("% 15s ", Buff)' ist, um den Pufferüberlauf an erster Stelle zu verhindern .... (aber ich werde Sie für Ihre Antwort empfehlen) –

+0

Er versucht herauszufinden, wie man ein Pufferüberlauf. Nicht verhindern/diagnostizieren. – lockcmpxchg8b

+0

Ich verstehe das. Obwohl ich ARM-Expertise nicht beanspruche, sollte es einfache Debugging-Tools geben, die die beteiligten Adressen anzeigen würden (übrigens, ich bin hier kein Downvote) –

Verwandte Themen