简述
之前做ctf的时候有碰到关于rust的逆向题目,但是看都看不懂。
rust被称作“最安全的编程语言”,名不虚传
这篇文章主要讲解的是怎么样来进行rust逆向入门
安装rust
1.安装VS
如果是win10系统,安装VS2019
如果是win11系统,安装VS2022(2019也可以,随意)
然后在安装vs时一定要记住
把这个勾上
等安装结束后
你能在VS上编写第一道c程序才算成功(
2.安装rust
在rust官网下下载rust安装程序
选择1,然后就能安装成功
可以在命令行上尝试使用
rustc --version
查看自己是否安装成功
3.VScode配置rust插件
我个人比较喜欢用VScode
在VScode插件中搜索 rust
选择第二个进行安装,因为rust-analyzer还在更新
Rust已经好久没有更新过了
4.尝试编写
创建一个工作目录,目录形式要是下面的形状
然后新建一个终端(在当前工作目录下)
然后就编译成功了
5.尝试调试
点击 运行 -> 添加配置
选择 C++ (Windows)
会生成配置文件
只要改”program”就可以了
编写第一个rust程序
俗话说 知己知彼,百战不殆
要想逆向rust,你首先得会写一点点rust!
rust在windows上的安装比较简单,前提是你已经装好了VS(因为rust进行编译时会使用到VS编写c/c++程序的一些工具),换句话说,你装好了VS并能在VS上写一个简单的c/c++程序出来(hello world),你就能安装rust并使用了。
安装好rust后,我们尝试编写一个简单的代码
fn main() {
println!("Hello, world!");
}
并把它编译得到exe文件。 我们将它拖入IDA中,并选择不使用pdb文件
可以看到它的main函数很奇怪,但是很简短,其中有几个函数,点进去发现 sub_7FF6B39512B0就是我们写的函数了
但是你直接f5得出来的结果也不是那么好看,需要点进去看看字符串是写什么。
rust逆向练习
用一个rust编写的ctf赛题进行逆向分析。 赛题附件
先运行一下,哦吼,啥提示都没有,就叫你输入字符串,输完了就没了。
把程序拖入ida中进行分析,看到main函数 我们知道,lea rcx,xxx的xxx就是编写的main函数了
这代码看起来很长,而且编译器自己加了一些脏东西,你真摁看,应该是看不出什么来的(除非你是大大佬,对rust了如指掌)
这时候别急,先用gdb单步调试程序
我们发现,当gdb运行到这里,让我们输入字符串。
我们先随便输入一些东西 比如 abcdefg
可以看到,rsp+0x8是我们输入的字符串的指针
回到ida中查看,rsp+0x8是v28
紧跟v28查看下面的代码,好像没对输入做什么(v28没有做变换)
我们先紧跟程序看看它有没有对输入做什么
我们发现输入好像没啥变化,但是下面多了一个东西
它把输入每字节拓展成了4字节
好吧,看起来没什么办法,用ida的调试程序进行调试,我们发现了关键函数
这里的v15是我们的输入变成4字节后的表,对v32所指向的数组进行变换后和它进行比对
我们查看v32是什么
好像找到了,用idapython脚本写一下
from idc_bc695 import *
addr = 0x7F47DF829000
flag = []
for i in range(34):
flag.append((Dword(addr+4*i)>>2)^0xa)
print(bytes(flag))
大功告成!!!