rust的自我复制程序

使用rust来实现一个自我复制的小程序

起因

如图↓

20231002122621

其实还给我分享了个聊天记录(点击查看)

大概讲得是将flag塞进了一个会自我复制得压缩文件里面了

实现

虽不难实现,但却是个很有趣的程序

首先我定义一个字符串变量x,它的值为程序的前半部分

1
fn main() {\n let x = 

再定义一个字符串变量y,使它的值为程序的后半部分

1
\n print!("{}{:?};\n let y = {:?};\n{}", x, x, y, y)\n}

最后使用print!宏输出x``y这两个变量的值

同时用{:?}格式化符号来显示字符串的原始形式(包括双引号和转义字符

完整的代码如下

1
2
3
4
5
fn main() {
let x = "fn main() {\n let x = ";
let y = ";\n print!(\"{}{:?};\\n let y = {:?};\\n{}\", x, x, y, y)\n}";
print!("{}{:?};\n let y = {:?};\n{}", x, x, y, y)
}

当然这不仅能输出代码本身,你还可以往里面塞点其他东西,比如我在里面插入了一段,使它输出的代码中包含"hello quine"并在控制台中打印”hello quine”

具体代码如下

1
2
3
4
5
fn main() {
let x = "fn main() {\n let x = ";
let y = ";\n print!(\"{}{:?};\\n let y = {:?};\\n{}\\n\\\"hello quine\\\"\", x, x, y, y)\n}";
print!("{}{:?};\n let y = {:?};\n{}\n\"hello quine\"", x, x, y, y)
}

代码仓库

MagicstMagoo/quine_rs (github.com)

引用