代码注入也可以在C#中工作!


15

给定以下C#程序输出False,请注入“恶意”代码行,以使程序输出True

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

您的答案应包含一个字符串,该字符串将替换第二个分号,并导致程序输出True,整体,True而仅输出True(甚至不包括换行符)。如果将stdout打印到控制台,并且将stdout重定向到文件,则必须执行此操作。

最短的答案将获胜。


您的客观获胜标准是什么?
JB 2014年

@JB拼图需要成功的标准吗?将进行编辑。
Kendall Frey 2014年

我主要是对代码高尔夫球的评论做出反应,但要点是:哪个是可接受的答案?
JB 2014年

@JB最短的答案是最好的答案。
Kendall Frey 2014年

好吧,那代码高尔夫,不是吗?
JB 2014年

Answers:


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
Kendall Frey 2014年

好的,我已更改WriteLineWrite
DankoDurbić,2014年

1
您可能可以通过将出口替换为来节省一些字节for(;;);,据我所知,没有什么要求程序终止...?
Joachim Isaksson 2014年

@JoachimIsaksson是的,符合指定的要求。
Kendall Frey 2014年

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 2014年

3
现在是Write:/如果它不断变化,我不知道该如何解决...
Vereos 2014年

@Vereos我想消除“换行或不换行”的歧义。
Kendall Frey 2014年

3
您不需要的2个实例Console.Write,可以使用\r而不是5 \bs。Console.Write("\rTrue ");
Brian S

我认为它不符合标准。实际上,它先输出False,然后再输出True。
microbian

1

如果将stdout重定向到文件,则可以将RamonBoza的答案概括为仍然有效。

假设程序在Linux上的Mono下运行,并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 ...在制品

我希望这能奏效,但是显然没有像我希望的那样在编译器中插入“ 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];

不打高尔夫球

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

欢迎来到社区!
暴民埃里克

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ谢谢。这是一个很棒的网站!!!
乔治·沃沃斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.