前言
这是一个Rust语言编写的程序,之前也没有接触过这种语言,一时确实无从下手,因此我也将此题分析放到了最后。为了更好的了解Rust编程以及逆向,先尝试使用Rust编写一个helloworld。所以我在自己的电脑上搭建的Rust编译环境。
Rust环境搭建与测试
官网
在网上找了好久才找到一些Rust的编程示例,这好像是最近兴起的类C的语言。
gitbook上有其第一版的程序设计指导。
因此我使用Rust编写如下代码,并且编译运行。
fn main(){
println!("Hello,world!");
}
编译 rustc hello.rs
说实话编译完了吓一跳,程序居然有5.5Mb
将生成的程序丢到IDA中,23333,表示想哭,连最简单的hellworld都看不懂了,而且我这还没去除符号表。
看来这Rust作为最安全的编程语言是有道理的。
其中第一个很长的main
才是真正的主函数
接着尝试加入简单判断的程序,代码如下:
fn main() {
println!("Guess the number!");
let x =5;
if x == 5 {
println!("x is five!");
} else {
println!("x is not five :(");
}
}
丢到IDA中,实在是看不下去了。有点无奈了。
其实冷静下来分析一下,虽然Rust的API有变化,但是代码块与代码块之间的关系并没有发生变化,所以还是头铁。
分析题目
0x0
大概了解了一下Rust编程,接下来还是老老实实的分析题目代码。首先定位到main
函数。试图寻找cmp
指令。幸运的是找到了cmp rax ,32
并且看到了分支.
所以可以确定flag的长度为32位,F5失效了。静态看确实看不出来,所以动态调试一番.
0x01
第一次变化,以四个为一组进行0 = 2;1 = 0;2 = 3;3 = 1
变换
0x02
第二次变化,这里需要仔细的去看下输入是如何变化的。说白了就是在找规律