Kod Enjeksiyon C # da çalışıyor!


15

Aşağıdaki C # program çıktısı verildiğinde, programın çıkacağı şekilde False'kötü amaçlı' bir kod satırı enjekte edin True.

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

Cevabınız ikinci noktalı virgül değiştirir ve çıkışa programı neden olan bir dize oluşmalıdır True, tüm Trueve hiçbir şey ama True(hatta bir satır). Stdout konsola yazdırılırsa ve stdout bir dosyaya yeniden yönlendirilirse bunu yapmalıdır.

En kısa cevap kazanır.


Hedef kazanma kriterin nedir?
JB

@JB Bulmacaların kazanan bir kritere ihtiyacı var mı? Düzenleyecek.
Kendall Frey

Ben çoğunlukla kod-golf sözüne tepki, ama nokta duruyor: kabul edilen cevap hangisi olacak?
JB

@JB En kısa cevap en iyi cevaptır.
Kendall Frey

Peki olduğu kod golf buraya kadar, değil mi?
JB

Yanıtlar:


17

52 karakter

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

böylece her şey şöyle olur:

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

Soruyu cevabınızın ortasında düzenlediğiniz için üzgünüm. Yeni satırlara artık izin verilmiyor, kullanmanız gerekecek Write.
Kendall Frey

Tamam, ben değiştim WriteLineiçinWrite
Danko Durbić

1
Çıktınızı değiştirerek bazı baytlar kaydedebilirsiniz for(;;);, gördüğüm hiçbir şey programın bitmesini gerektirmiyor ...
Joachim Isaksson

@JoachimIsaksson Evet, belirtilen gereksinimleri karşılar.
Kendall Frey

4
}static Program(){System.Console.Write(0<1);for(;;);her zaman olabilir}static Program(){for(System.Console.Write(0<1);;);
NPSF3000

7

C #, 51 karakter

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

Yalnızca standart çıktıda çalışır


Denediğim ilk şey, ne yazık ki ilk nedeniyle çalışmaz WriteLine.
Vereos

3
Şimdi Write: /
Değişmeye

@Vereos 'satırsonu veya satırsonu yok' belirsizliğini kaldırmak istedim.
Kendall Frey

3
2 örneğine ihtiyacınız yoktur Console.Writeve \r5 \bsn yerine kullanabilirsiniz . Console.Write("\rTrue ");
Brian S

Kriterleri karşıladığını sanmıyorum. Aslında önce False çıktı, daha sonra True tarafından üzerine yazılır.
microbian

1

Stdout bir dosyaya yeniden yönlendirilirse, RamonBoza'nın yanıtını hala çalışmaya genelleştirebilirsiniz.

Programın Linux'ta Mono altında çalıştığı varsayılarak, derleme Mono.Posix.dllyüklendi:

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

Bunun Windows üzerinde çalıştığından şüpheliyim, ancak muhtemelen eşdeğerdir isatty().


1

83 ... Devam Eden Çalışma

Bunun işe yarayacağını umuyordum, ancak görünüşe göre "False" derleyicimde umduğum gibi staj yapmıyor

//}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();
    }
}

Stdout yönlendirilirse bu çalışmaz.
Kendall Frey

0

Bunun kabul edilip edilmediğinden emin değilim.
Soru derleyici seçenekleri hakkında hiçbir şey söylemiyor, bu yüzden uygulamanın giriş noktasını değiştirebileceğimi varsayıyorum.
55 karakter, kabul edilen cevaptan 3 daha fazla

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

Tam

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

Topluluğa hoş geldiniz!
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Teşekkürler. Bu harika bir site !!!
George Vovos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.