Инъекция кода работает и в C #!


15

Учитывая следующий вывод программы на C # False, введите «вредоносную» строку кода, чтобы программа выводила True.

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

Ваш ответ должен состоять из строки, которая заменяет вторую точку с запятой и приводит к выводу программы True, целого Trueи ничего, кроме True(даже новой строки). Это должно быть сделано, если стандартный вывод выводится на консоль и если стандартный вывод перенаправляется в файл.

Самый короткий ответ выигрывает.


Каков ваш объективный критерий победы?
JB

@JB Нужно ли загадкам критерий победы? Буду редактировать.
Кендалл Фрей

Я в основном реагирую на замечание по коду-гольфу, но суть в том, какой ответ будет принят?
JB

@JB Самый короткий ответ - лучший ответ.
Кендалл Фрей

Ну это код-гольф, то, не так ли?
JB

Ответы:


17

52 персонажа

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

так что все становится:

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

Извините за редактирование вопроса в середине вашего ответа. Новые строки больше не разрешены, вам придется использовать Write.
Кендал Фрей

Хорошо, я изменился WriteLineнаWrite
Данко Дурбич

1
Вы могли бы, вероятно, сохранить несколько байтов, заменив свой выход for(;;);, ничего из того, что я видел, не требует завершения программы ...?
Иоахим Исакссон

@JoachimIsaksson Да, это соответствует требованиям, как указано.
Кендал Фрей

4
}static Program(){System.Console.Write(0<1);for(;;);всегда мог стать}static Program(){for(System.Console.Write(0<1);;);
NPSF3000

7

C #, 51 символ

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

Будет работать только на стандартном выходе


Первое, что я попробовал, к сожалению, из-за начального не получится WriteLine.
Vereos

3
Теперь это Write: / Я не понимаю, как нам удалось бы решить эту проблему, если она будет продолжать меняться ...
Vereos

@Vereos Я хотел убрать двусмысленность «новой строки или никакой новой строки».
Кендалл Фрей

3
Вам не нужно 2 экземпляра Console.Write, и вы можете использовать \rвместо 5 \bс. Console.Write("\rTrue ");
Брайан С

Я не думаю, что это соответствует критериям. Сначала он выводит False, а затем перезаписывается True.
микробиан

1

Вы можете обобщить ответ RamonBoza, чтобы он продолжал работать, если stdout перенаправлен в файл.

Предполагается, что программа работает под Mono в Linux с Mono.Posix.dllзагруженной сборкой :

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

Я сомневаюсь, что это работает на Windows, но, вероятно, есть эквивалент isatty().


1

83 ... WIP

Я надеялся, что это сработает, но, очевидно, «False» не интернируется, как я надеялся в моем компиляторе

//}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 перенаправлен.
Кендалл Фрей

0

Не уверен, что это принято.
Вопрос ничего не говорит о параметрах компилятора, поэтому я предполагаю, что могу изменить точку входа в приложение.
55 символов, на 3 больше принятого ответа

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

Полный

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

Добро пожаловать в сообщество!
Эрик Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Спасибо. Это фантастический сайт !!!
Георгий Вовос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.