Ich schrieb ein einfaches C-Programm an dem Stapelrahmen von printf suchen()C: printf() 's Stack-Schwachstelle?
#include <stdio.h>
int main(void){
printf("%s");
}
Ich dachte, die Art und Weise des Stapel arbeiten würde, ist main() würde zunächst drücken „% s“ auf den Stapel, so printf wird entweder Fehler segeln oder Müll ausgeben. Aber nirgends in meiner Disassembly drückt es "% s" auf den Stapel. Ich habe alle Werte zwischen% fp und% sp ausgedruckt, aber keiner davon enthält "% s".
Die Montage Dump für Haupt:
0x00400950 <+0>: lui gp,0x2
0x00400954 <+4>: addiu gp,gp,-32224
0x00400958 <+8>: addu gp,gp,t9
0x0040095c <+12>: addiu sp,sp,-32
0x00400960 <+16>: sw ra,28(sp)
0x00400964 <+20>: sw s8,24(sp)
0x00400968 <+24>: move s8,sp
0x0040096c <+28>: sw gp,16(sp)
0x00400970 <+32>: lw v0,-32744(gp)
0x00400974 <+36>: nop
0x00400978 <+40>: addiu v0,v0,2864
0x0040097c <+44>: move a0,v0
0x00400980 <+48>: lw v0,-32688(gp)
0x00400984 <+52>: nop
0x00400988 <+56>: move t9,v0
0x0040098c <+60>: jalr t9
0x00400990 <+64>: nop
0x00400994 <+68>: lw gp,16(s8)
0x00400998 <+72>: move sp,s8
0x0040099c <+76>: lw ra,28(sp)
0x004009a0 <+80>: lw s8,24(sp)
0x004009a4 <+84>: addiu sp,sp,32
0x004009a8 <+88>: jr ra
0x004009ac <+92>: nop
Wenn "% s" nicht auf dem Stapel gespeichert wird, wo sie gespeichert werden? Wo bekommt es auch die entsprechende Zeichenkette zum Ausdrucken?
Beginnen Sie mit dem Lesen des C-Standards. Es erzwingt nicht einmal die Verwendung eines spezifischen Speichermodells für automatische Variablen usw. Lesen Sie dann den ABI Ihrer Plattform, um zu sehen, wie Parameter zu/von Funktionen übergeben werden. Und Ihr Code ruft undefiniertes Verhalten auf. Der Compiler ist frei, Code zu generieren, der alle Ihre Nahrung isst. – Olaf
Mögliches Duplikat von [C String-Literale: Wohin gehen sie?] (Http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go) –
Bitte geben Sie an, auf welche CPU Sie zielen und welchen Compiler Sie verwenden –