Code Injection funktioniert auch in C #!


15

Fügen Sie bei der folgenden C # -Programmausgabe Falseeine "böswillige" Codezeile ein, sodass das Programm sie ausgibt True.

class Program
{
    static void Main()
    {
        System.Console.Write("False");
        ;
    }
}

Ihre Antwort sollte aus einer Zeichenfolge bestehen, die das zweite Semikolon ersetzt und das Programm dazu veranlasst True, das Ganze Trueund nichts als True(nicht einmal eine neue Zeile) auszugeben. Dies muss erfolgen, wenn stdout auf der Konsole gedruckt wird und wenn stdout in eine Datei umgeleitet wird.

Die kürzeste Antwort gewinnt.


Was ist Ihr objektives Gewinnkriterium?
JB

@JB Brauchen Rätsel ein Gewinnkriterium? Wird bearbeiten.
Kendall Frey

Ich reagiere hauptsächlich auf die Code-Golf-Bemerkung, aber der Punkt ist: Welche Antwort wird akzeptiert?
JB

@JB Kürzeste Antwort ist beste Antwort.
Kendall Frey

Nun, es ist Code-Golf, nicht wahr?
JB

Antworten:


17

52 Zeichen

}static Program(){System.Console.Write(0<1);for(;;);

so wird das Ganze:

class Program
{
    static void Main()
    {
        System.Console.Write( "False" );
    }
    static Program()
    {
        System.Console.Write( 0 < 1 ); 
        for ( ; ; ) ;
    }
}

Es tut uns leid, dass Sie die Frage in der Mitte Ihrer Antwort bearbeitet haben. Zeilenumbrüche sind nicht mehr erlaubt, Sie müssen verwenden Write.
Kendall Frey

Ok, ich habe geändert WriteLinezuWrite
Danko Durbić

1
Sie könnten wahrscheinlich ein paar Bytes einsparen, indem Sie Ihren Exit durch ersetzen for(;;);. Nichts, was ich gesehen habe, erfordert, dass das Programm beendet wird ...?
Joachim Isaksson

@JoachimIsaksson Ja, das entspricht den angegebenen Anforderungen.
Kendall Frey

4
}static Program(){System.Console.Write(0<1);for(;;);könnte immer werden}static Program(){for(System.Console.Write(0<1);;);
NPSF3000

7

C #, 51 Zeichen

Console.Write("\b\b\b\b\b");Console.Write("True ");

Funktioniert nur mit der Standardausgabe


Als erstes habe ich es versucht, leider klappt es wegen der Initiale nicht WriteLine.
Vereos

3
Jetzt ist es Write: / Ich verstehe nicht, wie wir es schaffen würden, das zu lösen, wenn es sich
ständig

@Vereos Ich wollte die Mehrdeutigkeit von 'newline or no newline' beseitigen.
Kendall Frey

3
Sie benötigen keine 2 Instanzen von Console.Writeund können \ranstelle von 5 \bs verwenden. Console.Write("\rTrue ");
Brian S

Ich denke nicht, dass es die Kriterien erfüllt. Tatsächlich wird zuerst False ausgegeben, das später von True überschrieben wird.
Mikroben

1

Sie können RamonBozas Antwort so verallgemeinern, dass sie immer noch funktioniert, wenn stdout in eine Datei umgeleitet wird.

Angenommen, das Programm läuft unter Mono unter Linux, wobei die Assembly Mono.Posix.dllgeladen ist:

if(Mono.Unix.Native.Syscall.isatty(1))
{
    Console.Write("\rTrue ");
}
else
{
    // Truncate the output file first
    Console.OpenStandardOutput().SetLength(0);
    Console.Write("True");
}

Ich bezweifle, dass dies unter Windows funktioniert, aber es gibt wahrscheinlich eine Entsprechung zu isatty().


1

83 ... WIP

Ich hatte gehofft, dass dies funktionieren würde, aber anscheinend wird "False" nicht so interniert, wie ich es in meinem Compiler gehofft hatte

//}unsafe static Program(){fixed(char*f="False"){*(long*)f=0x65007500720054;*(f+4)=' ';}
}unsafe static Program(){fixed(char*f="False")for(int i=5;i-->0;)*(f+i)="True "[i];

ungolfed

class Program
{
    static void Main(string[] args)
    {
        Console.Write("False");
    }

    unsafe static Program()
    {
        fixed (char* f = "False") for (int i = 5; i-- > 0; ) *(f + i) = "True "[i];
    }
}

1
class Program
{
    static void Main()
    {
        System.Console.Write("False");

        System.Console.Clear(); System.Console.Write("True");

        Console.ReadLine();
    }
}

Dies funktioniert nicht, wenn stdout umgeleitet wird.
Kendall Frey

0

Ich bin mir nicht sicher, ob dies akzeptiert wird.
Die Frage sagt nichts über Compiler-Optionen aus, also gehe ich davon aus, dass ich den Einstiegspunkt der App ändern kann.
55 Zeichen, 3 mehr als die akzeptierte Antwort

}class P{static void Main(){System.Console.Write(1>0);}

Voll

class Program
{
    static void Main()
    {
        System.Console.Write("False");
    }
    class P
    {
        static void Main() { System.Console.Write(1 > 0); }
    }
}

Willkommen in der Community!
Erik der Outgolfer

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Danke. Dies ist eine fantastische Seite !!!
George Vovos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.