Der Ausgabeinhalt von printf unter gcc hat ein Prozentzeichen (%)

Als ich kürzlich pwn lernte, stieß ich auf einen sehr seltsamen Ort. Ich hatte ihn schon einmal, aber es war mir egal. Ich werde heute einen Blick darauf werfen.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char sh[]="/bin/sh";
int init_func(){
    
    
    setvbuf(stdin,0,2,0);
    setvbuf(stdout,0,2,0);
    setvbuf(stderr,0,2,0);
    return 0;
}

int func(char *cmd){
    
    
	system(cmd);
	return 0;
}

int main(){
    
    
    char a[8] = {
    
    };
    char b[8] = {
    
    };
    //char a[1] = {'b'};
	puts("input:");
	gets(a);  
	printf(a);
	if(b[0]=='a'){
    
     
		func(sh);
	}
    return 0;
}
gcc question_1.c -o question_1
/question_1
input:
dddd
dddd% 

Was ich eingegeben habe, wurde gedruckt, aber es gab immer eine %
Meldung. Nachdem ich GPT gefragt hatte, fand ich heraus, dass dies daran liegt, dass getsbeim Lesen der Eingabe das Zeilenumbruchzeichen (\n) enthalten ist und printf entsprechend dem Eingabeinhalt ausgegeben wird.
Wenn der Benutzer „dddd\n“ eingibt, ist der in a enthaltene Inhalt „dddd\n“ und die printf-Funktion versucht, % zu finden, da % die Startmarke der Formatzeichenfolge ist. Wenn auf % kein gültiges Formatargument folgt, weist printf möglicherweise ein undefiniertes Verhalten auf, z. B. das Drucken des %-Symbols selbst.

Ersetzen Sie die Funktion printf durch die Funktion puts, um die Zeichenfolge auszugeben. Dies ist normal. Es gibt eine Zeichenfolge an den Standardausgabestream aus und fügt nach der Zeichenfolge automatisch ein Zeilenumbruchzeichen \n hinzu. Wenn wir also Puts verwenden, um eine Zeichenfolge auszugeben, wird sie unabhängig davon, was in dieser Zeichenfolge enthalten ist, als normale Textzeichenfolge behandelt und nicht als formatierte Zeichenfolge interpretiert.
oderprintf("%s\n", a);

Guess you like

Origin blog.csdn.net/weixin_50925658/article/details/135064774