rust逆向初探

2022-03-07

简述

之前做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))

大功告成!!!